1番目は質問文みあるコードを発展させた方法です。
s の 1 箇所を文字入れ替えしたものをすべて列挙し、t に一致するものがあるか? を調べています。
2番目は 上の方法では 省メモリーをめざしたものです。li の配列を使わずに済ませています。
3番目は、s == t の比較回数をへらすことをめざしたものです。
s と t を先頭から比べていき、差が出るところをみつけたら、その場所は文字入れ替えになっているかを調べます。もしそうなっていたら、残り部分をお一文字づつ一致するかを調べます。
pppp.pu
python3
1def check(s, t):
2 if s == t:
3 return True
45 li = []
6 for i in range(len(s) - 1):
7 s[i + 1], s[i] = s[i], s[i + 1]
8 li.append("".join(s))
9 s[i + 1], s[i] = s[i], s[i + 1]
1011 print(" li=", li)
1213 str_t = "".join(t)
14 for x in li:
15 if x == str_t:
16 return True
17 return False
1819def check_1(s, t):
20 if len(s) != len(t):
21 return False
2223 if s == t:
24 return True
2526 for i in range(len(s) - 1):
27 s[i + 1], s[i] = s[i], s[i + 1]
28 if s == t:
29 return True
30 s[i + 1], s[i] = s[i], s[i + 1]
3132 return False
3334def check_2(s, t):
35 if len(s) != len(t):
36 return False
3738 if s == t:
39 return True
4041 # s と t で差が出る位置を探す
42 pos = 0
43 for i in range(len(s) - 1):
44 if s[i] != t[i]:
45 pos = i
46 break
4748 # 文字にお入れ替えになっているか?
49 if s[pos] != t[pos + 1] or s[pos + 1] != t[pos]:
50 return False
5152 # 残りの部分はすべて一致するか?
53 for i in range(pos + 2, len(s) - 1):
54 if s[i] != t[i]:
55 return FAlse
5657 return TRue
5859# S = list(str(input()))
60# T = list(str(input()))
6162data = [
63 ["abc", "acb"],
64 ["abc", "abc"],
65 ["abc", "ab"],
66 ["abc", "abcd"],
67 ["abcd", "abcx"],
68]
6970print("--- check")
71for d in data:
72 s, t = list(d[0]), list(d[1])
73 print(d, check(s, t))
7475print("--- check_1")
76for d in data:
77 s, t = list(d[0]), list(d[1])
78 print(d, check_1(s, t))
7980print("--- check_2")
81for d in data:
82 s, t = list(d[0]), list(d[1])
83 print(d, check_1(s, t))
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。