暴力的方法,刚开始substr 用错导致走了很多弯路,需要注意的是第一个参数是首个下标,第二的参数是截取的长度,还需要注意的是s.substr(0,length) 才是整个字符串,所以第二个循环j<=length;
路漫漫其修远,还要加油呀!以前没怎么接触过算法,所以想先写个暴力的算法让自己先理解,然后再试其它优化的方法
#include<iostream>
#include <string>
#include<unordered_set>
#include<set>
using namespace std;
class Solution {
public:
bool allunique( string str)
{
//
set<char > set;
// cout<< "unistr:::"<< str<<endl;
for( int i=0; i <str.size() ;i++)
{
// cout<<set.find(str[i])<<endl;
if(set.find(str[i])!=set.end())
return false;
else
set.insert(str[i]);
}
return true;
}
int lengthOfLongestSubstring(string s) {
int start=0;
int end =0;
int length=0;
if (s.size()<=1)
return s.size();
for( int i = 0 ; i < s.size() ; i++)
{
for( int j = i+1; j <=s.size() ; j++) // 注意这里需要等号,那么为了遍历所有的字串str.substr(0,length)
{
//
// cout << "i---------->>>"<<i<<endl;
// cout << "j---------->>>"<<j<<endl;
//
// cout<< "substr:"<< s.substr(i,j)<<endl;
// cout<<"s.substr(i,j):"<<s.substr(i,j)<<endl;
if( allunique(s.substr(i,j-i)) ) // 如果这里面是最短的
{
cout<<"s.substr(i,j)22222:"<<s.substr(i,j-i)<<endl;
//cout<< "length"<<length<<endl;
string stemp=s.substr(i,j-i);
if (length <stemp.size() )
{
length = stemp.size() ;
start=i;
end = j;
}
}
}
}
cout<< s.substr(start,end-start);
return length;
}
};
int main() {
cout << Solution().lengthOfLongestSubstring( "au" )<<endl; //3
string s = "au";
cout<< s.substr(0,s.size())<<endl;
// cout << Solution().lengthOfLongestSubstring( "bbbbb" )<<endl; //1
// cout << Solution().lengthOfLongestSubstring( "pwwkew" )<<endl; //3
// cout << Solution().lengthOfLongestSubstring( "c" )<<endl; //1
// cout << Solution().lengthOfLongestSubstring( "" )<<endl; //0
return 0;
}