問題文
問題文はそのままコピーします。
You are given two strings s and t.
String t is generated by random shuffling string s and then add one more letter at a random position.
Return the letter that was added to t.
Example 1:
Input: s = "abcd", t = "abcde"
Output: "e"
Explanation: 'e' is the letter that was added.
Example 2:
Input: s = "", t = "y"
Output: "y"
Example 3:
Input: s = "a", t = "aa"
Output: "a"
Example 4:
Input: s = "ae", t = "aea"
Output: "a"
Constraints:
0 <= s.length <= 1000
t.length == s.length + 1
s and t consist of lower-case English letters.
Exampleのように、s = 'ae'
, t='aea'
の時、このt
配列のa
をoutputしたいのことです。
簡単だと思いますが、ある特別な方法をシェアしたいと思っています。
解き方
この問題に対して、最初に思いついた方法はfor文でループして、dictを2つ使ってそれぞれ配列の要素をcountするだと思います。
だが!もっと面白い解き方があります!
pythonの組み込み関数のord()
とchr()
を使って、listのみで問題を解決できます!
では!コードを載ります。
class Solution:
def findTheDifference(self, s: str, t: str) -> str:
if len(s) == 0:
return t
table = [0] * 26
for i in range(len(t)):
if i < len(s):
table[ord(s[i]) - ord('a')] -= 1
table[ord(t[i]) - ord('a')] += 1
for i in range(26):
if table[i] != 0:
return chr(i + 97)
return 'a'
1行目と2行目はleetcode上のコードなので、基本は無視しても大丈夫です。
最初はif文で、配列s
がもしなにも入っていないなら、そのまま配列t
が戻ります。
そして、if文が成り立っていない場合、26個の要素が含まれている配列を作成します。
続いて、for文はややこしいなので、図に合わせて説明します。
例えば、上の配列はs
, 下は配列t
とします。この2つの配列に対して、同時にfor文を掛けます。最初に出てきたのは配列s
のa
です。この時、countを-1にします。続いて、配列t
の最初の要素はb
で、countを+1にします。2回目に入って、配列s
のb
のcountを-1にし、配列t
のc
の countを+1にします。ここで、2つの配列にある要素b
のcountを思い出してください!、-1, +1で0になります!。そのあとは同じのことを繰り返し、最後は必ずどっちかの要素が1になります。私たちはこの0ではない要素を探せばよいです。
って、ord
とchr
はなんやろと思うかもしれませんが、簡単です!indexを設定することです。
print(ord('a'))
>>> 97
文字列a
を数値に変化することです。一方、chr
は数値を文字列に変換することです。
ord(s[i]) - ord('a')
こうやって書く理由として、私たち先作った26個要素が含まれている配列があるではないですか。ord
で変換すると26を超えてしまったので、ようするにindex 0,1,2,3,4...
を作るためです。
これでfor文は終了し、最後はcount != 0
の要素を探せてreturnしたら良いです。