题目描述
给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。
提示:
1 <= pattern.length <= 300
pattern 只包含小写英文字母
1 <= s.length <= 3000
s 只包含小写英文字母和 ' '
s 不包含 任何前导或尾随对空格
s 中每个单词都被 单个空格 分隔
题目分析
首先判断pattern串的长度与s串的单词数是否相等,如果不相等那么这两个字符串的模式必然不一样,如果相等了在继续进行下一项的判断,因为总共有26个小写字母,所以我们可以利用字母的值为串的下标将单词存储起来,如果字母一样就检查当前单词是否出现过,如果没有出现过记录下来此单词,如果已经出现过了那么就将当前单词与已出现的单词作比较,如果相同那么目前的模式仍然一样。依次比对下去即可。
代码
bool wordPattern(char* pattern, char* s) {
char *x[26];
for(int i=0; i<26; i++){
x[i] = NULL;
}
int pattern_length = 0;
while(pattern[pattern_length++]!='\0');
pattern_length--;
int k = 0;
int count = 0;
for(;s[k]!='\0'; k++){
if(s[k]==' '){
count++;
}
}
if(k!=0){
count++;
}
if(count!=pattern_length){
return false;
}
int i=0;
int j=0;
for(i=0; pattern[i]!='\0'; i++){
int length_word = 0;
if(x[pattern[i]-'a']==NULL){
while(s[j+length_word]!=' '&&s[j+length_word]!='\0'){
length_word++;
}
x[pattern[i]-'a'] = (char *)malloc(sizeof(char)*(length_word+1));
for(int k=0; k<length_word; k++){
x[pattern[i]-'a'][k] = s[j+k];
}
x[pattern[i]-'a'][length_word] = '\0';
j = j + length_word+1;
}else{
char *y = NULL;
while(s[j+length_word]!=' '&&s[j+length_word]!='\0'){
length_word++;
}
y = (char *)malloc(sizeof(char)*(length_word+1));
for(int k=0; k<length_word; k++){
y[k] = s[j+k];
}
y[length_word] = '\0';
j = j + length_word+1;
if(strcmp(x[pattern[i]-'a'], y)){
return false;
}
}
}
for(int i=0; i<26; i++){
for(int j=i+1; j<26; j++){
if(x[i]!=NULL&&x[j]!=NULL){
if(!strcmp(x[i], x[j])){
return false;
}
}
}
}
return true;
}