用C语言编写给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。
时间: 2024-03-01 20:45:18 浏览: 187
给定一个字符串 s,要找出其中不含有重复字符的最长子串的长度,可以使用双指针维护一个滑动窗口,不断移动右指针,直到遇到重复字符的时候把左指针移到前面的重复字符的下一位。移动指针过程中,记录窗口长度的最大值即为答案。具体实现可以使用一个哈希表来存储每个字符最后一次出现的位置,如果当前字符已经在哈希表中出现过并且它的位置在左指针的右边,就更新左指针的位置。最后返回最大的窗口长度即可。
C语言代码如下:
```c
int lengthOfLongestSubstring(char * s){
int len = strlen(s);
int left = 0, res = 0;
int map[128] = {0};
for (int i = 0; i < len; i++) {
if (map[s[i]] > left) {
left = map[s[i]];
}
map[s[i]] = i + 1;
res = fmax(res, i - left + 1);
}
return res;
}
```
相关问题
给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。c语言
在C语言中,你可以使用滑动窗口或者哈希集合(如`std::unordered_set`)来解决这个问题。这里是一个基于滑动窗口思想的解决方案:
```c
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
int lengthOfLongestSubstring(char* s) {
int n = strlen(s);
if (n == 0) return 0;
int left = 0, right = 0;
int maxLength = 0;
bool visited[256] = {false}; // 假设字符集大小为ASCII
while (right < n) {
// 如果当前字符未访问过,或者右边界位置的下一个字符还未访问过
if (!visited[s[right]] || (visited[s[right]] && right - left + 1 > maxLength)) {
visited[s[right]] = true;
maxLength = right - left + 1;
} else {
// 否则,将左边界向右移动一位,并清空该字符的访问标记
visited[s[left]] = false;
left++;
}
right++;
}
return maxLength;
}
int main() {
char s[] = "pwwkew";
printf("Length of longest substring without repeating characters: %d\n", lengthOfLongestSubstring(s));
return 0;
}
```
这个函数的主要思路是从前往后遍历字符串,维护一个左边界left和右边界right,同时记录已知的最长无重复子串长度maxLength。当遇到重复字符时,更新左边界并清除对应的访问标记,直到右边界处的字符不再重复。
给定一个字符串 s ,找出其中不含有重复字符的最长子串的长度代码c语言
在C语言中,可以使用滑动窗口(Sliding Window)算法来解决这个问题。滑动窗口是一种常见的动态规划思想,通过维护一个字符集窗口,每次检查新字符是否已经在集合中,如果不在则加入窗口并更新最大长度,如果在则移除窗口左侧的第一个已重复字符。
下面是一个简单的C语言函数实现:
```c
#include <stdio.h>
#include <stdbool.h>
#define MAX_CHAR 128
int lengthOfLongestSubstring(char* s) {
int n = strlen(s);
bool char_set[MAX_CHAR] = {false}; // 用于记录字符是否出现过
int left = 0, right = 0;
int maxLength = 0;
while (right < n) {
if (!char_set[s[right]]) {
// 如果字符未出现,则添加到窗口
char_set[s[right]] = true;
maxLength = max(maxLength, right - left + 1); // 更新最大长度
right++;
} else {
// 如果字符已经出现,移除左侧的重复字符
char_set[s[left]] = false; // 将左边界字符设回未出现
left++; // 移动左边界
}
}
return maxLength;
}
// 辅助函数,返回两个数的最大值
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
char str[] = "abcabcbb";
printf("Length of the longest substring without repeating characters: %d\n", lengthOfLongestSubstring(str));
return 0;
}
```
在这个代码中,`lengthOfLongestSubstring` 函数接收一个字符串指针,通过双指针 `left` 和 `right` 的移动,不断更新不含重复字符的子串的左右边界,并计算其长度。
阅读全文
相关推荐
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)