3333<p ><strong >说明:</strong ><br >
3434你可以假设  ; <code >pattern</code >  ; 只包含小写字母,  ; <code >str</code >  ; 包含了由单个空格分隔的小写字母。  ;   ;  ; </p >
3535
36-
3736## 解法
3837
3938<!-- 这里可写通用的实现逻辑 -->
4746``` python
4847class Solution :
4948 def wordPattern (self , pattern : str , s : str ) -> bool :
50- ch2str, str2ch = {}, {}
51- ss = s.split(' ' )
49+ s = s.split(' ' )
5250 n = len (pattern)
53- if n != len (ss ):
51+ if n != len (s ):
5452 return False
53+ c2str, str2c = collections.defaultdict(), collections.defaultdict()
5554 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:
5757 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 :
5959 return False
60- ch2str[pattern[i]] = ss[i]
61- str2ch[ss[i]] = pattern[i]
60+ c2str[k], str2c[v] = v, k
6261 return True
6362```
6463
@@ -69,23 +68,24 @@ class Solution:
6968``` java
7069class Solution {
7170 public boolean wordPattern (String pattern , String s ) {
72- Map<Character , String > ch2str = new HashMap<> ();
73- Map<String , Character > str2ch = new HashMap<> ();
7471 String [] ss = s. split(" " );
7572 int n = pattern. length();
7673 if (n != ss. length) {
7774 return false ;
7875 }
76+ Map<Character , String > c2str = new HashMap<> ();
77+ Map<String , Character > str2c = new HashMap<> ();
7978 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)) {
8282 return false ;
8383 }
84- if (str2ch . containsKey(ss[i] ) && ! str2ch . get(ss[i]) . equals(ch )) {
84+ if (str2c . containsKey(v ) && ! Objects . equals(str2c . get(v), k )) {
8585 return false ;
8686 }
87- ch2str . put(ch, ss[i] );
88- str2ch . put(ss[i], ch );
87+ c2str . put(k, v );
88+ str2c . put(v, k );
8989 }
9090 return true ;
9191 }
@@ -113,6 +113,59 @@ function wordPattern(pattern: string, s: string): boolean {
113113};
114114```
115115
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+
116169### ** ...**
117170
118171```
0 commit comments