编程也是属于搭积木的游戏,能不重复造轮子就不造轮子;
知识点
操作字符串的知识点;字符串相当于是一个数组;
哈希表的的创建和使用方法;
动态规划的知识点;
解题思路
解法一:暴力法
具体步骤:创建一个字符串容器,首先放进去容器;
再遍历下一个元素,要是相等就略过,不相等就放进容器里面去;
最后新字符串的大小就是长度;
class Solution {
public:
int lengthOfLongestSubstring(string s) {
vector<char> ans; // 创建一个新的字符容器
int a=0 ; // 盛放不重复字符串大小
int i,j ;// 创建一个循环变量
int len=s.length();
if(s.length()==0){
return 0;
}
if(s.length()==1){
return 1;
}
for(i=0;i<len;i++){ // 遍历字符串的每一个字符
for(j=0;j<ans.size();j++){ // 判断是否新的字符在新字符串里面有相等的
if(s[i]==ans[j]){
if(ans.size()>a){
a=ans.size();
} // 不重复字符串大小
ans.clear(); // 清空
ans.push_back(s[i]);
break;
}
}
// 遍历循环玩新建字符串也没有相等的
if(j==ans.size()){
ans.push_back(s[i]);
}
}
if(a>ans.size()){
return a;
}else{
return ans.size();
}
}
};
解法2:滑动窗口
思想即用两个指引的变量,来指着滑动右指引;
class Solution
{
public:
int lengthOfLongestSubstring(string s)
{
//s[start,end) 前面包含 后面不包含
int start=0, end=0, length=0, result=0 ; // 定义并初始化变量
int sSize = int(s.size()); // 字符串变量长度
while (end < sSize)
{
char tmpChar = s[end]; // end 指的字符
for (int index = start; index < end; index++)
{
if (tmpChar == s[index]) // 如果在之前有重复的,就立刻把start指针重新指引
{
start = index + 1;
length = end - start;
break;
}
}
end++;
length++;
result = max(result, length);
}
return result;
}
};
解法3:动态规划
借助动态规划的思路,从前到后求出以每个位置为终止位置,所构成无重复子串的长度,之后求这些长度的最大值即可。
public class Solution
{
public int LengthOfLongestSubstring(string s)
{
if (string.IsNullOrEmpty(s))
return 0;
int[] result = new int[s.Length];
result[0] = 1;
for (int i = 1; i < s.Length; i++)
{
int count = GetLength(i, s);
result[i] = result[i-1] < count ? result[i-1]+1 : count;
}
return result.Max();
}
private int GetLength(int index,string s)
{
char c = s[index];
int result = 1;
for (int i = index-1; i >= 0; i--)
{
if (s[i] != c)
result += 1;
else
break;
}
return result;
}
}
小结
能努力一次看懂的就一次看懂,不留遗憾,一旦错过了就真的错过了;