给定一种 pattern(模式)
和一个字符串 str
,判断 str
是否遵循相同的模式。
这里的遵循指完全匹配,例如, pattern
里的每个字母和字符串 str
中的每个非空单词之间存在着双向连接的对应模式。
示例1:
输入: pattern ="abba"
, str ="dog cat cat dog"
输出: true
示例 2:
输入:pattern ="abba"
, str ="dog cat cat fish"
输出: false
示例 3:
输入: pattern ="aaaa"
, str ="dog cat cat dog"
输出: false
示例 4:
输入: pattern ="abba"
, str ="dog dog dog dog"
输出: false
说明:
你可以假设 pattern
只包含小写字母, str
包含了由单个空格分隔的小写字母。
提供两个思路吧
第一个思路最简单就是用字符串哈希,用pattern的每一个位置的字幕。作为哈希表的key,然后将str的单词作为value打进去哈希表
这个思路最简单了
第二个思路:我直接就是上去模拟,首先先把pattern的长度和str的空格数+1做一个比较,如果不想当就直接return false;
用一个结构体记录一对一的结果:
1 struct node 2 { 3 char ha[1010]; 4 } a[200];
然后在把遍历一遍patter,因为题目只要求小写字母,所以每个a[i]对对应一个字母,把他对于的单词拷贝到ha
每次拷贝前先跑一遍是否出现重复,如果出现重复就return false;
最后再看一遍i,j是否跑到了len1,len2-1
大体思路就是这样子,具体看我代码
1 bool wordPattern(char* pattern, char* str) 2 { 3 4 ///printf("%d ",'a'); 5 ///printf("[%c]",str[0]); 6 memset(a,-1,sizeof(a)); 7 ///printf("111%d",a[1].ha[0]); 8 int flag1=-1,flag2=-1; 9 char tem[1010]; 10 int top=0; 11 int len1=strlen(pattern),len2=strlen(str); 12 int i,ans2=0; 13 for(int l=0;l<len2;l++) 14 if(str[l]==' ') 15 ans2++; 16 if(ans2==0) 17 { 18 if(len1>1) 19 return false; 20 } 21 else 22 { 23 if(ans2+1!=len1) 24 return false; 25 } 26 for(i=0; i<len1; i++) 27 { 28 memset(tem,0,sizeof(tem)); 29 if(flag1==-1&&flag2==-1) 30 { 31 ///printf("flag1=%d flag2=%d ",flag1,flag2); 32 top=0; 33 int j; 34 for(j=0; j<len2; j++) 35 { 36 if(j==len2-1) 37 { 38 flag1=len2-1; 39 } 40 if(str[j]==' ') 41 { 42 ///printf("%d ",j); 43 flag1=j; 44 break; 45 } 46 } 47 //printf("%d ",flag1); 48 for(j=0; j<flag1; j++) 49 tem[top++]=str[j]; 50 if(flag1==len2-1) 51 tem[top++]=str[flag1]; 52 strcpy(a[(int)pattern[i]].ha,tem); 53 54 //printf("[%s]",a[(int)pattern[i]].ha); 55 } 56 else if(flag1!=-1&&flag2==-1) 57 { 58 59 ///printf("flag1=%d flag2=%d ",flag1,flag2); 60 memset(tem,0,sizeof(tem)); 61 top=0; 62 for(int j=flag1+1; j<=len2; j++) 63 { 64 if(j==len2-1) 65 { 66 flag2=len2-1; 67 } 68 if(str[j]==' ') 69 { 70 flag2=j; 71 break; 72 } 73 } 74 for(int j=flag1+1; j<flag2; j++) 75 tem[top++]=str[j]; 76 77 if(flag2==len2-1) 78 tem[top++]=str[flag2]; 79 80 if(pattern[i]==pattern[i-1]) 81 { 82 if(strcmp(a[(int)pattern[i]].ha,tem)!=0) 83 return false; 84 } 85 ///printf("[[[%s",tem); 86 for(int k=96; k<=122; k++) 87 { 88 if(k==(int)pattern[i]) 89 continue; 90 91 if(strcmp(a[k].ha,tem)==0) 92 return false; 93 94 } 95 strcpy(a[(int)pattern[i]].ha,tem); 96 97 98 } 99 else 100 { 101 102 memset(tem,0,sizeof(tem)); 103 if(flag1==len2-1||flag2==len2-1) 104 return true; 105 if(flag1>flag2) 106 { 107 ///printf("flag1=%d flag2=%d ",flag1,flag2); 108 top=0; 109 for(int j=flag1+1; j<=len2; j++) 110 { 111 if(j==len2-1) 112 { 113 flag2=len2-1; 114 } 115 if(str[j]==' ') 116 { 117 flag2=j; 118 break; 119 } 120 121 } 122 for(int j=flag1+1; j<flag2; j++) 123 tem[top++]=str[j]; 124 125 if(flag2==len2-1) 126 tem[top++]=str[flag2]; 127 128 if(a[(int)pattern[i]].ha[0]!=-1) 129 { 130 //printf("{{%s}} ",a[(int)pattern[i]].ha); 131 //printf("%s ",tem); 132 if(strcmp(a[(int)pattern[i]].ha,tem)!=0) 133 return false; 134 } 135 else 136 { 137 for(int k=97; k<=122; k++) 138 { 139 if(k==(int)pattern[i]) 140 continue; 141 else 142 { 143 144 if(strcmp(a[k].ha,tem)==0) 145 return false; 146 } 147 } 148 strcpy(a[(int)pattern[i]].ha,tem); 149 } 150 151 } 152 else 153 { 154 ///printf("{flag1=%d flag2=%d} ",flag1,flag2); 155 if(flag1==len2-1||flag2==len2-1) 156 return true; 157 top=0; 158 for(int j=flag2+1; j<=len2; j++) 159 { 160 if(j==len2-1) 161 { 162 flag1=len2-1; 163 } 164 if(str[j]==' ') 165 { 166 flag1=j; 167 break; 168 } 169 } 170 for(int j=flag2+1; j<flag1; j++) 171 tem[top++]=str[j]; 172 173 if(flag1==len2-1) 174 tem[top++]=str[flag1]; 175 176 if(a[(int)pattern[i]].ha[0]!=-1) 177 { 178 ///printf("%s",a[(int)pattern[i]].ha); 179 ///printf("{%s} ",tem); 180 if(strcmp(a[(int)pattern[i]].ha,tem)!=0) 181 return false; 182 } 183 else 184 { 185 for(int k=97; k<=122; k++) 186 { 187 if((k==(int)pattern[i])) 188 continue; 189 else 190 { 191 if(strcmp(a[k].ha,tem)==0) 192 return false; 193 } 194 } 195 strcpy(a[(int)pattern[i]].ha,tem); 196 } 197 198 } 199 } 200 } 201 202 if(i!=len1) 203 return false; 204 205 printf("111"); 206 if(flag1>flag2) 207 { 208 if(flag1!=len2-1) 209 return false; 210 } else { 211 if(flag2!=len2-1) 212 return false; 213 } 214 215 return true; 216 }