leetcode c++ 中等题之无重复字符的最长子串
个人解答
int lengthOfLongestSubstring ( string s) {
map< char , int > mymap;
int start = 0 , end = 0 ;
int n = s. length ( ) ;
int length = 0 , result = 0 ;
while ( end < n) {
char tmp = s[ end] ;
if ( mymap[ tmp] && mymap[ tmp] >= start) {
start = mymap[ tmp] ;
mymap[ tmp] = end + 1 ;
length = end - start;
}
mymap[ tmp] = end + 1 ;
length++ ;
end++ ;
result = max ( result, length) ;
}
return result;
}
官方答案
class Solution {
public :
int lengthOfLongestSubstring ( string s) {
unordered_set< char > occ;
int n = s. size ( ) ;
int rk = - 1 , ans = 0 ;
for ( int i = 0 ; i < n; ++ i) {
if ( i != 0 ) {
occ. erase ( s[ i - 1 ] ) ;
}
while ( rk + 1 < n && ! occ. count ( s[ rk + 1 ] ) ) {
occ. insert ( s[ rk + 1 ] ) ;
++ rk;
}
ans = max ( ans, rk - i + 1 ) ;
}
return ans;
}
} ;
作者:LeetCode- Solution
链接:https: / / leetcode- cn. com/ problems/ longest- substring- without- repeating- characters/ solution/ wu- zhong- fu- zi- fu- de- zui- chang- zi- chuan- by- leetc- 2 /
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
个人总结
这个题用滑动窗口较好理解 只要清楚知道执行的流程 就能很快写出代码 不过答案给出的代码我也没怎么看懂 我的方法中end取的是map中char处于s的哪个位置 而不是其下标 因为经测试 暂未存入map的字符对应val值为0 避免无法区分s的第一个字符与不存在的字符 故做此区别 还有代码注释中if中后半部分判断条件非常值得注意 为了防止我们的start回跳至已经被我们排除的区间中 故只有处于start右边位置的重复字符值得我们转跳(左边的已经被排除了 跳个屁) 我就是在这个条件这卡了很久很久 最后用用例“abba”才勉强意识到这个问题 下面列出未优化 且未意识到start不能会跳的代码 以做警示
int lengthOfLongestSubstring ( string s) {
map< char , int > mymap;
int start = 0 , end = 0 ;
int n = s. length ( ) ;
int length = 0 , result = 0 ;
while ( end < n) {
char tmp = s[ end] ;
if ( mymap[ tmp] ) {
start = mymap[ tmp] ;
mymap[ tmp] = end + 1 ;
length = end - start + 1 ;
}
else {
mymap[ tmp] = end + 1 ;
length++ ;
}
end++ ;
result = max ( result, length) ;
}
return result;
}