题目:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例:
abcabcbb
输出的结果应该是3,最长的无重复的字串是'abc'
果然无论做什么都要静下心来啊!昨晚上卡了一个多小时愣是没改出来,今天仔细的考虑了一下,半个小时搞定…………
思路:
简单的滑动窗口问题,遍历字符串,将出现过得字符用map将它的下标存下来。
当遍历过程中出现map>0的情况,说明出现了重复的字符。此时的i-j(i是窗口右边的指针,j是窗口左边的指针)即是该字串的长度,维护一下答案的最大值。
注意:
1. 因为要用map>0判断重复字符是否出现,所以要预先在原来的字符串前边加一个特殊字符,预处理一下,使下标从1开始。
2. 要处理好字符串最后一个字符的情况
代码:
#include <bits/stdc++.h> #include <iostream> using namespace std; //alkbcdb int lengthOfLongestSubstring(string s) { map<char,int> mp; s = "#"+s; //cout<<"s: "<<s.length()<<endl; int j = 1,ans = 0; for(int i=1; i<=s.length(); i++) { char idx = s[i]; if(i == s.length()-1) { if(mp[idx] > 0) ans = max(ans,i-j); else ans = max(ans,i-j+1); } else { if(mp[idx] > 0) { //cout<<"idx: "<<idx<<" j: "<<j<<" i: "<<i<<endl; ans = max(ans,i-j); while(j <= mp[idx]) { mp[s[j++]] = 0; } mp[idx] = i; //cout<<"later j: "<<j<<" and ans: "<<ans<<endl; } else mp[idx] = i; } } return ans; } int main() { string str; while(cin>>str) { cout<<lengthOfLongestSubstring(str)<<endl; } return 0; }