字符串包含问题:判断小字符串的所有字符是否大字符串都有
思路一:针对小字符串的每一个字符一一与大字符串的字符轮询比较即可,很明显时间复杂度为O(n*m)
bool compare(string s1,string s2)
{
int j;
for(int i = 0; i < s1.length(); i++)
{
for( j = 0; j < s2.length(); j++)
{
if(s1.at(i) == s2.at(j))
{
break;
}
}
if(j==s2.length())
{
return false;
}
}
return true;
}
思路二:对两个字符串分别排序,同时依次轮询,则排序O(mlogm)+O(nlogn),轮询O(m+n);总时间复杂度为O(mlogm)+O(nlogn)+O(m+n)
int partition(string &str,int low,int high)
{
int key = str[high];
int i = low - 1;
for(int j = low; j < high; j++)
{
if(str[j] <= key)
{
i++;
swap(str[i],str[j]);
}
}
swap(str[i+1],str[high]);
return i+1;
}
void quickSort(string &str,int low,int high)
{
if(low<high)
{
int k = partition(str,low,high);
quickSort(str,low,k-1);
quickSort(str,k+1,high);
}
return;
}
bool compare(string s1,string s2)
{
int i = 0;
int j = 0;
while(i < s1.length() && j < s2.length())
{
while(s1[i] < s2[j] && i < s1.length() - 1)
i++;
if(s1[i] != s2[j])
break;
j++;
}
if(j==s2.length())return true;
else return false;
}
int main()
{
string s1 = "abd";
string s2 = "absdfe";
if(compare(s1,s2))
{
cout<<"包含"<<endl;
}
else
cout<<"不包含"<<endl;
return 0;
}
思路三:hash表,将小字符串映射到初始化为0的表中,有则改为1.在轮询大字符串,有则将1改为0。最后如果表全为零,包含,否则不包含。则轮询了一次,复杂度为O(m+n)