From e593f2548a511dbcb87b0a7f0cc71016f26ab8d3 Mon Sep 17 00:00:00 2001 From: yamashita-ki Date: Fri, 12 Sep 2025 23:16:37 +0900 Subject: [PATCH 1/2] Valid Palindrome --- 125. Valid Palindrome.md | 113 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 125. Valid Palindrome.md diff --git a/125. Valid Palindrome.md b/125. Valid Palindrome.md new file mode 100644 index 0000000..c124893 --- /dev/null +++ b/125. Valid Palindrome.md @@ -0,0 +1,113 @@ +## step1 とりあえず解く +- 計算量 + - 時間 + - O(n) + - 空間 + - O(n) +- 回文の対象がアルファベット・数値のみだったのでreplaceAllで対象の文字意外を空文字に変換した +- 空間計算量をO(1)にしたかったが思いつかず、愚直な方法で解いた + +```java +class Solution { + public boolean isPalindrome(String s) { + s = s.replaceAll("[^a-zA-Z0-9]", "").toLowerCase(); + System.out.println(s); + char[] chars = s.toCharArray(); + int charsLength = chars.length; + for(int i = 0; i< charsLength/2; i++){ + if(chars[i] != chars[charsLength-i-1]){ + return false; + } + } + return true; + } +} +``` + +## step2 他の人の回答を見る +- `Character.isLetterOrDigit` というメソッドを学べた +- 空間的・時間的計算量は私の回答と変わらないがシンプルに書かれていて可読性が高く感じた +- String Builderで文字列連結しているところも `+` に比べメモリ効率が良さそう + +```java +public class Solution { + public boolean isPalindrome(String s) { + StringBuilder newStr = new StringBuilder(); + for (char c : s.toCharArray()) { + if (Character.isLetterOrDigit(c)) { + newStr.append(Character.toLowerCase(c)); + } + } + return newStr.toString().equals(newStr.reverse().toString()); + } +} +``` + +- こちらが模範解答に近そう +- 計算量 + - 時間 + - O(n) + - 空間 + - O(1) +- 2つポインターを使い、与えられた文字列を加工せずに使うことで空間計算量を減らしている +- + +```java +public class Solution { + public boolean isPalindrome(String s) { + int l = 0, r = s.length() - 1; + + while (l < r) { + while (l < r && !alphaNum(s.charAt(l))) { + l++; + } + while (r > l && !alphaNum(s.charAt(r))) { + r--; + } + if (Character.toLowerCase(s.charAt(l)) != Character.toLowerCase(s.charAt(r))) { + return false; + } + l++; r--; + } + return true; + } + + public boolean alphaNum(char c) { + return (c >= 'A' && c <= 'Z' || + c >= 'a' && c <= 'z' || + c >= '0' && c <= '9'); + } +} +``` + +### step3 3回書く +- step2の回答とほぼおなじ +- booleanを返すメソッド名はis~としたのでそこを修正 + +```java +class Solution { + public boolean isPalindrome(String s) { + int r = s.length() -1; + int l = 0; + while(l < r){ + while(l < r && !this.isAlphanumeric(s.charAt(r))){ + r--; + } + while(l < r && !this.isAlphanumeric(s.charAt(l))){ + l++; + } + if(Character.toLowerCase(s.charAt(r)) != Character.toLowerCase(s.charAt(l))){ + return false; + } + r--; + l++; + } + return true; + } + + private boolean isAlphanumeric(char c){ + return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || ('0' <= c && c <= '9'); + } +} + +``` \ No newline at end of file From 6b90c4b97fa2b460b30415ae530692d6f6a66d20 Mon Sep 17 00:00:00 2001 From: yamashita-ki Date: Fri, 12 Sep 2025 23:18:56 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=E8=AA=A4=E5=AD=97=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 125. Valid Palindrome.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/125. Valid Palindrome.md b/125. Valid Palindrome.md index c124893..cb3e597 100644 --- a/125. Valid Palindrome.md +++ b/125. Valid Palindrome.md @@ -82,7 +82,7 @@ public class Solution { ### step3 3回書く - step2の回答とほぼおなじ -- booleanを返すメソッド名はis~としたのでそこを修正 +- 個人的にbooleanを返すメソッド名はis~とかにしたいのでそこを修正 ```java class Solution {