回文部分文字列の数
5531 ワード
説明
小文字のアルファベット文字列 s
が与えられた場合、 s
の回文部分文字列の数を返します.
制約:
1 ≤ n ≤ 1,000
n
は s
の長さです例1
入力
s = "tacocat"
出力
10
説明
The palindromic substrings are:
"t"
"a"
"c"
"o"
"c"
"a"
"t"
"coc"
"acoca"
"tacocat"
直感
DP[i][j]
は、substring(i,j)
が回文文字列の場合を意味します
i==j
-> dp[i][j] = true
; i!=j
-> dp[i][j] = dp[i+1][j-1] && char[i]==char[j]
詳細
false
: boolean[][] dp = new boolean[length][length]
; count = 0
; start
を end
と比較します.◦
start == end
: dp[start][end] = true
;◦
chars[start]
と chars[end]
を比較実装
import java.util.*;
class Solution {
public int solve(String s) {
int length = s.length();
boolean[][] dp = new boolean[length][length];
int count = 0;
for (int end = 0; end < length; end++) {
for (int start = 0; start <= end; start++) {
if (start == end) {
dp[start][end] = true;
count++;
} else {
if (s.charAt(start) == s.charAt(end)) {
if (end - start == 1 || dp[start + 1][end - 1]) {
dp[start][end] = true;
count++;
}
}
}
}
}
return count;
}
}
時間の複雑さ
import java.util.*;
class Solution {
public int solve(String s) {
int length = s.length();
boolean[][] dp = new boolean[length][length];
int count = 0;
for (int end = 0; end < length; end++) {
for (int start = 0; start <= end; start++) {
if (start == end) {
dp[start][end] = true;
count++;
} else {
if (s.charAt(start) == s.charAt(end)) {
if (end - start == 1 || dp[start + 1][end - 1]) {
dp[start][end] = true;
count++;
}
}
}
}
}
return count;
}
}
Reference
この問題について(回文部分文字列の数), 我々は、より多くの情報をここで見つけました https://dev.to/jiangwenqi/number-of-palindromic-substrings-342nテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol