门户网站 特点,企业邮箱怎么申请账号,广东官网网站建设怎么样,网站建设了解给定一个字符串 s #xff0c;请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s abcabcbb
输出: 3
解释: 因为无重复字符的最长子串是 abc#xff0c;所以其长度为 3。示例 2:
输入: s bbbbb
输出: 1
解释: 因为无…给定一个字符串 s 请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s abcabcbb
输出: 3
解释: 因为无重复字符的最长子串是 abc所以其长度为 3。示例 2:
输入: s bbbbb
输出: 1
解释: 因为无重复字符的最长子串是 b所以其长度为 1。示例 3:
输入: s pwwkew
输出: 3
解释: 因为无重复字符的最长子串是 wke所以其长度为 3。请注意你的答案必须是 子串 的长度pwke 是一个子序列不是子串。提示
0 s.length 5 * 104s 由英文字母、数字、符号和空格组成
题解
首先是我自己的思路因为比较直接所以比较暴力
遍历字符串的每个字符按照当前无重复字符的字串的长度提取子串在字串中寻找是否有相同的字符如果有相同的字符更新子串的起始字符为相同字符的后面一个字符同时更新当前字串的长度
这里寻找相同字符的位置比较讲究首先找出相同字符在子串的位置再加上字串在字符串中的位置之所以用rfind倒着查找是避免存在多个相同字串返回第一个字串的结果用rfind加上i的位置可以返回正确位置的子串的位置
class Solution {
public:int lengthOfLongestSubstring(string s) {if(s)return 0;int longest1,begin0,longer1;string son;for(int i1;is.size();i){sons.substr(begin,longer);int newBeginson.find(s[i]);if(newBegin!string::npos){newBegins.rfind(son,i-1)newBegin;longeri-newBegin;beginnewBegin1;}else{longer;longestlongestlonger?longer:longest;}}return longest;}
}; 下面这个是更加简洁和优化的写法思路还是一样的
class Solution {
public:int lengthOfLongestSubstring(string s) {int longest0,begin0,end0;while(ends.size()){for(int ibegin;iend;i){ //子串重复判断if(s[i]s[end]){begini1; //更新子串起始位置break;}}longestmax(longest,end-begin1);end;}return longest;}
};