53
53
54
54
<!-- 这里可写通用的实现逻辑 -->
55
55
56
+ ** 方法一:简单计数**
57
+
58
+ 我们用变量 $cnt$ 记录两个字符串中相同位置字符不同的个数,两个字符串若满足题目要求,那么 $cnt$ 一定为 $0$ 或 $2$。另外用两个字符变量 $c1$ 和 $c2$ 记录两个字符串中相同位置字符不同的字符。
59
+
60
+ 同时遍历两个字符串,对于相同位置的两个字符 $a$ 和 $b$,如果 $a \ne b$,那么 $cnt$ 自增 $1$。如果此时 $cnt$ 大于 $2$,或者 $cnt$ 为 $2$ 且 $a \ne c2$ 或 $b \ne c1$,那么直接返回 ` false ` 。注意记录一下 $c1$ 和 $c2$。
61
+
62
+ 遍历结束,若 $cnt\neq 1$,返回 ` true ` 。
63
+
64
+ 时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为字符串长度。
65
+
56
66
<!-- tabs:start -->
57
67
58
68
### ** Python3**
62
72
``` python
63
73
class Solution :
64
74
def areAlmostEqual (self , s1 : str , s2 : str ) -> bool :
65
- cnt, n = 0 , len (s1)
75
+ cnt = 0
66
76
c1 = c2 = None
67
- for i in range (n ):
68
- if s1[i] != s2[i] :
77
+ for a, b in zip (s1, s2 ):
78
+ if a != b :
69
79
cnt += 1
70
- if (cnt == 2 and (s1[i] != c2 or s2[i] != c1)) or cnt > 2 :
80
+ if cnt > 2 or (cnt == 2 and (a != c2 or b != c1)):
71
81
return False
72
- c1, c2 = s1[i], s2[i]
73
- return cnt == 0 or cnt == 2
82
+ c1, c2 = a, b
83
+ return cnt != 1
74
84
```
75
85
76
86
### ** Java**
@@ -80,22 +90,19 @@ class Solution:
80
90
``` java
81
91
class Solution {
82
92
public boolean areAlmostEqual (String s1 , String s2 ) {
83
- int n = s1. length();
84
93
int cnt = 0 ;
85
- char c1 = 0 ;
86
- char c2 = 0 ;
87
- for (int i = 0 ; i < n; ++ i) {
88
- char t1 = s1. charAt(i), t2 = s2. charAt(i);
89
- if (t1 != t2) {
90
- ++ cnt;
91
- if ((cnt == 2 && (c1 != t2 || c2 != t1)) || cnt > 2 ) {
94
+ char c1 = 0 , c2 = 0 ;
95
+ for (int i = 0 ; i < s1. length(); ++ i) {
96
+ char a = s1. charAt(i), b = s2. charAt(i);
97
+ if (a != b) {
98
+ if (++ cnt > 2 || (cnt == 2 && (a != c2 || b != c1))) {
92
99
return false ;
93
100
}
94
- c1 = t1 ;
95
- c2 = t2 ;
101
+ c1 = a ;
102
+ c2 = b ;
96
103
}
97
104
}
98
- return cnt == 0 || cnt == 2 ;
105
+ return cnt != 1 ;
99
106
}
100
107
}
101
108
```
@@ -106,18 +113,18 @@ class Solution {
106
113
class Solution {
107
114
public:
108
115
bool areAlmostEqual(string s1, string s2) {
109
- char c1 = 0, c2 = 0;
110
- int n = s1.size();
111
116
int cnt = 0;
112
- for (int i = 0; i < n; ++i) {
113
- if (s1[ i] != s2[ i] ) {
114
- ++cnt;
115
- if ((cnt == 2 && (c1 != s2[ i] || c2 != s1[ i] )) || cnt > 2) return false;
116
- c1 = s1[ i] ;
117
- c2 = s2[ i] ;
117
+ char c1 = 0, c2 = 0;
118
+ for (int i = 0; i < s1.size(); ++i) {
119
+ char a = s1[ i] , b = s2[ i] ;
120
+ if (a != b) {
121
+ if (++cnt > 2 || (cnt == 2 && (a != c2 || b != c1))) {
122
+ return false;
123
+ }
124
+ c1 = a, c2 = b;
118
125
}
119
126
}
120
- return cnt == 0 || cnt == 2 ;
127
+ return cnt != 1 ;
121
128
}
122
129
};
123
130
```
@@ -126,18 +133,40 @@ public:
126
133
127
134
```go
128
135
func areAlmostEqual(s1 string, s2 string) bool {
136
+ cnt := 0
129
137
var c1, c2 byte
130
- cnt, n := 0, len(s1)
131
- for i := 0; i < n; i++ {
132
- if s1[i] != s2[i] {
138
+ for i := range s1 {
139
+ a, b := s1[i], s2[i]
140
+ if a != b {
133
141
cnt++
134
- if (cnt == 2 && (c1 != s2[i] || c2 != s1[i])) || cnt > 2 {
142
+ if cnt > 2 || (cnt == 2 && (a != c2 || b != c1)) {
135
143
return false
136
144
}
137
- c1, c2 = s1[i], s2[i]
145
+ c1, c2 = a, b
138
146
}
139
147
}
140
- return cnt == 0 || cnt == 2
148
+ return cnt != 1
149
+ }
150
+ ```
151
+
152
+ ### ** TypeScript**
153
+
154
+ ``` ts
155
+ function areAlmostEqual(s1 : string , s2 : string ): boolean {
156
+ let c1, c2;
157
+ let cnt = 0 ;
158
+ for (let i = 0 ; i < s1 .length ; ++ i ) {
159
+ const a = s1 .charAt (i );
160
+ const b = s2 .charAt (i );
161
+ if (a != b ) {
162
+ if (++ cnt > 2 || (cnt == 2 && (a != c2 || b != c1 ))) {
163
+ return false ;
164
+ }
165
+ c1 = a ;
166
+ c2 = b ;
167
+ }
168
+ }
169
+ return cnt != 1 ;
141
170
}
142
171
```
143
172
0 commit comments