33
33
<p ><strong >说明:</strong ><br >
34
34
你可以假设  ; <code >pattern</code >  ; 只包含小写字母,  ; <code >str</code >  ; 包含了由单个空格分隔的小写字母。  ;   ;  ; </p >
35
35
36
-
37
36
## 解法
38
37
39
38
<!-- 这里可写通用的实现逻辑 -->
47
46
``` python
48
47
class Solution :
49
48
def wordPattern (self , pattern : str , s : str ) -> bool :
50
- ch2str, str2ch = {}, {}
51
- ss = s.split(' ' )
49
+ s = s.split(' ' )
52
50
n = len (pattern)
53
- if n != len (ss ):
51
+ if n != len (s ):
54
52
return False
53
+ c2str, str2c = collections.defaultdict(), collections.defaultdict()
55
54
for i in range (n):
56
- if ch2str.get(pattern[i]) is not None and ch2str.get(pattern[i]) != ss[i]:
55
+ k, v = pattern[i], s[i]
56
+ if k in c2str and c2str[k] != v:
57
57
return False
58
- if str2ch.get(ss[i]) is not None and str2ch.get(ss[i]) != pattern[i] :
58
+ if v in str2c and str2c[v] != k :
59
59
return False
60
- ch2str[pattern[i]] = ss[i]
61
- str2ch[ss[i]] = pattern[i]
60
+ c2str[k], str2c[v] = v, k
62
61
return True
63
62
```
64
63
@@ -69,23 +68,24 @@ class Solution:
69
68
``` java
70
69
class Solution {
71
70
public boolean wordPattern (String pattern , String s ) {
72
- Map<Character , String > ch2str = new HashMap<> ();
73
- Map<String , Character > str2ch = new HashMap<> ();
74
71
String [] ss = s. split(" " );
75
72
int n = pattern. length();
76
73
if (n != ss. length) {
77
74
return false ;
78
75
}
76
+ Map<Character , String > c2str = new HashMap<> ();
77
+ Map<String , Character > str2c = new HashMap<> ();
79
78
for (int i = 0 ; i < n; ++ i) {
80
- char ch = pattern. charAt(i);
81
- if (ch2str. containsKey(ch) && ! ch2str. get(ch). equals(ss[i])) {
79
+ char k = pattern. charAt(i);
80
+ String v = ss[i];
81
+ if (c2str. containsKey(k) && ! Objects . equals(c2str. get(k), v)) {
82
82
return false ;
83
83
}
84
- if (str2ch . containsKey(ss[i] ) && ! str2ch . get(ss[i]) . equals(ch )) {
84
+ if (str2c . containsKey(v ) && ! Objects . equals(str2c . get(v), k )) {
85
85
return false ;
86
86
}
87
- ch2str . put(ch, ss[i] );
88
- str2ch . put(ss[i], ch );
87
+ c2str . put(k, v );
88
+ str2c . put(v, k );
89
89
}
90
90
return true ;
91
91
}
@@ -113,6 +113,59 @@ function wordPattern(pattern: string, s: string): boolean {
113
113
};
114
114
```
115
115
116
+ ### ** C++**
117
+
118
+ ``` cpp
119
+ class Solution {
120
+ public:
121
+ bool wordPattern(string pattern, string s) {
122
+ istringstream is(s);
123
+ vector<string > ss;
124
+ while (is >> s) ss.push_back(s);
125
+ int n = pattern.size();
126
+ if (n != ss.size()) return false;
127
+
128
+ unordered_map<char, string> c2str;
129
+ unordered_map<string, char> str2c;
130
+ for (int i = 0; i < n; ++i)
131
+ {
132
+ char k = pattern[i];
133
+ string v = ss[i];
134
+ if (c2str.count(k) && c2str[k] != v) return false;
135
+ if (str2c.count(v) && str2c[v] != k) return false;
136
+ c2str[k] = v;
137
+ str2c[v] = k;
138
+ }
139
+ return true ;
140
+ }
141
+ };
142
+ ```
143
+
144
+ ### ** Go**
145
+
146
+ ``` go
147
+ func wordPattern (pattern string , s string ) bool {
148
+ ss := strings.Split (s, " " )
149
+ n := len (pattern)
150
+ if n != len (ss) {
151
+ return false
152
+ }
153
+ c2str := make (map [byte ]string )
154
+ str2c := make (map [string ]byte )
155
+ for i := 0 ; i < n; i++ {
156
+ k , v := pattern[i], ss[i]
157
+ if c2str[k] != " " && c2str[k] != v {
158
+ return false
159
+ }
160
+ if str2c[v] > 0 && str2c[v] != k {
161
+ return false
162
+ }
163
+ c2str[k], str2c[v] = v, k
164
+ }
165
+ return true
166
+ }
167
+ ```
168
+
116
169
### ** ...**
117
170
118
171
```
0 commit comments