第三题:无重复字符的最长子串
- 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度
示例 1:
- 输入: s = "abcabcbb"
- 输出: 3
- 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3
示例 2:
- 输入: s = "bbbbb"
- 输出: 1
- 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1
示例 3:
- 输入: s = "pwwkew"
- 输出: 3
- 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
- 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:
- 输入: s = ""
- 输出: 0
提示:
- 0 <= s.length <= 5 * 104
- s 由英文字母、数字、符号和空格组成
解题:
/**
* @file 3.cpp
* @author HarkerYX
* @brief 无重复字符的最长子串
* @version 0.1
* @date 2021-04-26
*
* @copyright Copyright (c) 2021
*
*/
/*
第三题:无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度
解题思路:
双重循环,每次内层循环往前移动都要和外层循环之间的子串判断是否有重复
稍微提高一点效率在 j=i+maxSubLen,下一次内层循环可以直接从上一次开始,想象成一个滑动的窗口
*/
#include <stdio.h>
#include <windows.h>
// 判断范围内的子串是否有重复
int JudgeRepeat(char *s, int begin, int end)
{
for(int i = begin; i < end + 1; i++){
for (int j = i + 1; j < end + 1; j++) {
if (s[i] == s[j])
return 1;
}
}
return 0;
}
/**
* @brief
*
* @param s
* @return int
*/
int lengthOfLongestSubstring(char * s){
//记录个数
int maxSubLen = 0;
char *p = s;
char *q = s;
char *longStr = NULL;
int len = strlen(s);
for (int i = 0; i < len; i++){
// j = i+ maxSubLen ,这里加上 maxSubLen 可以提高判断效率
for (int j = i + maxSubLen; j < len; j++){
if(JudgeRepeat(s,i,j))
break;
else{
maxSubLen = maxSubLen > (j - i + 1) ? maxSubLen : (j - i + 1);
//查看每次获取的最长子串 步骤 (debug 使用,)
if(maxSubLen>0){
longStr = (char *)malloc(maxSubLen*sizeof(char)+1);
memcpy(longStr,s+i,maxSubLen);
longStr[maxSubLen] = '\0';
printf("获得最长子串长度是: %d\n",maxSubLen);
printf("获得最长子串是: [%s]\n",longStr);
free(longStr);
longStr = NULL;
}
}
}
}
printf("[ 获得最长子串长度是: %d ]\n",maxSubLen);
return maxSubLen;
}
int main(void)
{
// char *str = "pwwkew";
// char *str = "";
// char *str = "bbbbb";
char *str = "abcabcbb";
lengthOfLongestSubstring(str);
return 0;
}
获得最长子串长度是: 1
获得最长子串是: [a]
获得最长子串长度是: 2
获得最长子串是: [ab]
获得最长子串长度是: 3
获得最长子串是: [abc]
[ 获得最长子串长度是: 3 ]