この問題はleetcode longest palindrome substringですが
かなり勉強させていただきました。
まず使い慣れたfor i in range(5)で行ごとに操作するのではなく
斜めに操作することを考えていきましょう。
なぜなら、この問題を解くのに斜めの操作が必要だったらからです
b = 5 S = [[0]*b for i in range(b)] for i in range(b): for j in range(5): S[i][j] = b * i + j for s in S: print(s) print("loop horizontally") for s in S: for o in s: print(o, end=",") print("loop vertically") for r in range(len(S)): for c in range(len(S)): print(S[c][r], end=",") print("loop diagonally") for i in range(len(S)): for r in range(len(S)): for c in range(r, len(S)): try: print(S[r][c+i], end=",") except: pass break
一番最後のが斜めです。
しかし、この解答を見たときに、もう少しシンプルにかけることがわかりました
の最後の部分です
step = 2 for _ in range(length-2): i = 0 j = i+step while (i < length) and (j < length): arr_2d[i][j] = (s[i] == s[j]) and arr_2d[i+1][j-1] if arr_2d[i][j] and (j-i+1 > max_sub_len): max_sub_len = j-i+1 substring = (i, j) i += 1 j += 1 step += 1
一つは行を操作するfor が外側にありますね
そして内側はwhileで階段状に操作しているところがあります、これでいいんですね。
ちょっとこれを元に自分のソースコードを改造してみます
print("loop diagonally wiht for and while") for offset in range(len(S)): r = 0 c = 0 + offset while r < len(S) and c < len(S): print(S[r][c], end=",") r+=1 c+=1
とうことで現れ出たのがこのループです。3つ目のループが内分、少しスッキリしましたね。
ではこれで longest palindrome substringを再実装していきます。
以上です