给定一个字符串,找出最长的不具有重复字符的子串的长度。 例如,“abcabcbb”不具有重复字符的最长子串是“abc”,长度为3。 对于“bbbbb”,最长的不具有重复字符的子串是“b”,长度为1。
//解法一,暴力搜索法
#include<unordered_map> class Solution { public: /** * * @param s string字符串 * @return int整型 */ int lengthOfLongestSubstring(string s) { // write code here if (s.empty()) return 0; int maxlen = 0; //搜索所有子串 //从每一个字符开始的,所有可能长度的字符串 for (int start = 0; start < s.size(); ++start) { for (int length = 1; length <= s.size() - start; ++length) { //构造子串 string tmp = s.substr(start, length); //统计每个子串的字符个数 unordered_map<char, int> count; for (const auto& e : tmp) { ++count[e]; } //标记是否没有重复字符 int flag = 1; for (const auto& e : count) { if (e.second != 1) flag = 0; } //更新最大长度 if (flag && maxlen < length) { maxlen = length; } } } return maxlen; } };//解法二,滑动窗口法
//string str; //str=str[0]; //窗口界限 int start=0,end=0; //记录窗口有哪些字符 set<char> st; //滑动窗口 for(end=0;end<s.size();++end){ //如果发现窗口新出现的字符已经出现过,则start向左滑动缩小 //窗口,直到无重复字符 while(start<=end&&st.find(s[end])!=st.end()){ st.erase(s[start]); ++start; } //记录每个合法窗口的长度 maxlen=max(maxlen,end-start+1); //更新窗口字符表 st.insert(s[end]); } if(maxlen==INT_MIN) return 0; return maxlen;