您的位置:首页 > 产品设计 > UI/UE

字符串str1、str2,测试str2中字符是否都包含在str1中。例如:str1="abcdef",str2="aaaaccc",则返回true

2014-06-24 10:33 381 查看
字符串str1、str2,测试str2中出现过的字符是否都包含在str1中,不考虑个数。例如:str1="abcdef",str2="aaaaccc",则返回true

算法描述:

step1:定义hash[26]并初始化为0。用来记录str2出现的字符

step2:轮询str2。字母映射到数组hash[]中,如果hash[i]==0,将hash[i]置为1,num++;否则不作任何操作。

step3:轮询str1。如果hash[i]==1(str2的某个字符在str1中),将hash[i]置为0,num--;否则不作任何操作。

step4:如果num==0,则返回true;否则返回false。

//InPut:string str1;string str2
//OutPut:True or False
//时间复杂度:T(N)=O(m+n);空间复杂度O(1)
bool stringContain(string str1,string str2)
{
int hash[26] = {0};
int num = 0;
//轮询短字符串
for(int i=0;i<str2.length();i++)   //不是str2.length,是str2.length()
{
int index = str2[i]-'a';
if(hash[index]==0)
{
hash[index]=1;
num++;
}
}
//轮询长字符串
for(int j=0;j<str1.length();j++)
{
int index = str1[j]-'a';
if(hash[index]==1)
{
hash[index]=0;
num--;
if(num==0)
break;
}
}
if(num==0)
return true;
else
return false;
}


变形:字符串str1、str2,测试str2中字符是否都包含在str1中,考虑个数。例如:str1="abcdef",str2="aaaaccc",则返回false。

/*测试字符串str2中字符是否都包含在str1中,考虑字符个数*/
bool stringContain2(const string &str1, const string &str2)
{
unsigned int count[256] = {0};
//	memset(count,0,sizeof(count));
int i, j, flagnum=0, len1=str1.length(), len2=str2.length();

if(len1<len2)
return false;

for(i=0;i<len2;i++)
{
count[str2[i]]++;   //统计每个字符出现的个数(<2^32)
flagnum++;
}

for(j=0;j<len1;j++)
{
if(count[str1[j]]>0)
{
count[str1[j]]--;
flagnum--;
}
}

if(flagnum==0)
return true;
else
return false;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐