1.字符串互为变形词
(1).用哈希表做字符统计
(2).先排序,再判断
bool hash1(string str1,string str2)
{
int arr1[256];
memset(arr1,0,sizeof(arr1));
for (int i=0;i<str1.length();i++)
{
arr1[str1[i]]++;
}
int arr2[256];
memset(arr2,0,sizeof(arr2));
for(int i=0;i<str2.length();i++)
{
arr2[str2[i]]++;
}
for(int i=0;i<256;i++)
{
if (arr1[i]!=arr2[i])
return false;
}
return true;
}
bool hash2(string str1,string str2)
{
if(str1.length()!=str2.length())
return false;
sort(str1.begin(),str1.end());
sort(str2.begin(),str2.end());
for(int i=0;i<str1.length();i++)
{
if (str1[i]!=str2[i])
return false;
}
return true;
}
int main( )
{
string str1="123";
string str2="321";
bool flag;
flag=hash2(str1,str2);
cout<<flag;
system("pause");
return 0;
}
2.判断字符串互为旋转词
最优时间复杂度O(n)
(1)判断两个字符串的长度是否相等
(2)长度相等,生成str1+str1长度的大字符串
(3)用KMP算法查找大字符串中是否有str2
3.给定字符串,做单词间的逆序调整
(1)实现字符串逆序函数
(2)将整个句子逆序
(3)每个单词逆序
void reverse(string & str,int start,int end)
{
int i=start;
int j =end;
char temp;
while(i<=j)
{
temp=str[i];
str[i]=str[j];
str[j]=temp;
i++;
j--;
}
}
void reverse_sentence(string &str)
{
if (str.empty())
return ;
int start=0;
int end=str.length()-1;
reverse(str,start,end);
for(int i=0;i<str.length();i++)
{
if(str[i]==' ')
{
reverse(str,start,i-1);
start=i+1;
}
if(i==end)
{
reverse(str,start,end);
}
}
}
4.旋转词,例如“ABCDE”调整为“DEABC”,右移i个位置,要求时间复杂度为o(n),空间复杂度为o(1)
(1)逆转前i-1个字符
(2)逆转i个以后的字符
(3)逆转整个字符串
{
if(i>str.length())
return;
reverse(str,0,i-1);
reverse(str,i,str.length()-1);
reverse(str,0,str.length()-1);
cout<<str<<endl;
}
5.字符串的排序
使得字符串拼接得到的大字符串是最小的
bool cmp(string str1,string str2)
{
string str_one;
string str_two;
str_one=str1+str2;
str_two=str2+str1;
return str1<str2;
}
int main( )
{
string str1="ABCDE";
reverse_part(str1,3);
vector<string> vec;
string str;
while(cin>>str)
{
vec.push_back(str);//ctrl+z 结束输入
}
string last;
sort(vec.begin(),vec.end(),cmp);//字符串从小到大排序 to_string(num[i]):数字转化为字符
for(int i=0;i<vec.size();i++)
{
last+=vec[i];
}
cout<<last;
system("pause");
return 0;
}
6.给定字符串,判断是不是整体有效的 括号字符串
bool judge(string str)
{
int num=0;
for(int i=0;i<str.length();i++)
{
if(str[i]=='(')
num++;
if(str[i]==')')
num--;
if(num<0)
return false;
}
if(num!=0)
return false;
return true;
}
7.给定一个字符串,返回最长无重复子字符串的长度