问题:如果两个字符串中的字符串一样,出现的次数也一样,只是顺序不同,则认为两个字符串是兄弟字符串.现在提供一个字符串,请问如何在字典中迅速找到他的兄弟字符串
/*
2016 9 27
问题:
如果两个字符串中的字符串一样,出现的次数也一样,只是顺序不同,则认为两个字符串是兄弟字符串.
现在提供一个字符串,请问如何在字典中迅速找到他的兄弟字符串
1.简单起见字符串的元素都为小写
2.目标abc 字典为kjjhkjdkfnsljdfcbakjhjbcaacb(有cba bca acb三个兄弟)
思路
1.建立一个26个元素的数组,对应26个字母,某个字母出现一次则在对应的位置++
2.一次在字典中取出三个元素组成待验证字符串,按1步骤处理
3.比较两个数组是否相同,若相同则是兄弟字符串
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/*
判断是否为兄弟a是比较的字符串,b是字典
*/
int FindCharBrother(char *a,char *b,int left,int right)
{
int arr_a[26]={0};
int arr_obj[26]={0};
int i;
for(i=0;i<strlen(a);i++)
{
arr_a[a[i]-'a']++;
}
for(i=left;i<right;i++)
{
arr_obj[b[i]-'a']++;
}
//判断两个数组是否相同
for(i=0;i<26;i++)
{
if(arr_a[i]!=arr_obj[i])
return 0;
}
return 1;
}
/*
打印兄弟字符串
*/
void PrinCharBrother(char *b,int left,int right)
{
int i;
for(i=left;i<right;i++)
{
printf("%c",b[i]);
}
printf("\n");
}
/*
依次在字典中取出strlen(a)元素,用FindCharBrother()判断是否为兄弟
*/
void CharBrother(char *a,char *b)
{
int i;
int flag;
for(i=0;i<strlen(b);i++)
{
flag=FindCharBrother(a,b,i,i+strlen(a));//依次在字典中取出strlen(a)元素判断是否为兄弟
if(flag)
PrinCharBrother(b,i,i+strlen(a));
}
}
int main()
{
char a[]="abc";
char b[]="kjjhkjdkfnsljdfcbakjhjbcaacb";//字典
CharBrother(a,b);
}
./a.out
cba
bca
acb