Equivalent String
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=84562#problem/E
题意:
给定两组字符串a和b(由小写字母构成),判断是否相等。相等条件如下:
1)若a和b为奇数字符串,只需判断字符串是否一致;
2)若a和b为偶数字符串,可将字符串分为长度相等的两部分,再进行比较。如将a分为长度相等的a1和a2两部分,将b分为长度相等的b1和b2两部分,若a1与b1相等且a2与b2相等,或者a1与b2相等且a2与b1相等,则a与b相等。
案例:
Input
aaba
abaa
Output
YES
Input
aabb
abab
Output
NO
分析:
奇数字符串与偶数字符串条件判断有所差异,但可以考虑将偶数字符串不断拆分,最终成为奇数字符串与奇数字符串的比较(比如字符长度为6的两字符串之间进行比较,可以拆分为3+3两部分,再根据相等条件进行比较,又如字符串长度为8的两字符串之间进行比较,单个字符串可以先拆分为4+4,再将每部分拆分为2+2,2为偶数重复刚才的步骤2拆分为1+1再根据等价条件进行比较),如此一来,采用DFS及暴力求解得出最终结果。阐述不清,阅览如下具体步骤可知。
源代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 # define maxn 200000 6 char a[maxn],b[maxn]; 7 int dfs(char *m,char *n,int len) 8 { 9 int k=0; 10 if(len%2==1)//判断奇数字符串是否相等 11 { 12 for(int i=0;i<len;i++) 13 { if(m[i]!=n[i])//k值判断字符串中不等字符个数 14 k++; 15 } 16 if(!k) return 1; 17 else return 0; 18 } 19 else//判断偶数字符串 20 { 21 if((dfs(m,n,len/2)&&dfs(m+len/2,n+len/2,len/2))||(dfs(m+len/2,n,len/2)&&dfs(m,n+len/2,len/2)))//偶数字符串相等判断条件 22 return 1; 23 else return 0; 24 } 25 } 26 int main() 27 { 28 scanf("%s%s",a,b);//输入字符串 29 if(dfs(a,b,strlen(a)))//判断字符串相等 30 cout<<"YES"<<endl; 31 else cout<<"NO"<<endl; 32 return 0; 33 }