Palindrome - tanakakenji/Rinko GitHub Wiki
åæã¨ã¯ãåããčĒãã§ãåžãããčĒãã§ãåãä¸ĻãŗãĢãĒãæååãŽãã¨ã§ããããã§ã¯ãåæãĢéĸããæ§ã ãĒãã¯ããã¯ãC++ãŽãŗãŧãäžãį¨ããĻč§ŖčĒŦããžãã
æãåį´ãĒãĸãããŧãã¯ãæååãåčģĸãããĻå ãŽæååã¨æ¯čŧãããã¨ã§ãã
#include <iostream>
#include <string>
#include <algorithm>
bool isPalindromeReverse(const std::string& s) {
std::string reversed = s;
std::reverse(reversed.begin(), reversed.end());
return s == reversed;
}
int main() {
std::string str = "racecar";
std::cout << str << " is palindrome: " << (isPalindromeReverse(str) ? "Yes" : "No") << std::endl;
return 0;
}
ããŽãĸãããŧãã¯į°Ąåã§ãããčŋŊå ãŽãĄãĸãĒãäŊŋį¨ããæååå ¨äŊãåčģĸãããåŋ čĻããããžãã
ããåšįįãĒãĸãããŧãã¯ã2ã¤ãŽãã¤ãŗãŋãäŊŋį¨ãããã¨ã§ãã
bool isPalindromeTwoPointers(const std::string& s) {
int left = 0;
int right = s.length() - 1;
while (left < right) {
if (s[left] != s[right]) {
return false;
}
left++;
right--;
}
return true;
}
ããŽãĸãããŧãã¯čŋŊå ãŽãĄãĸãĒãäŊŋį¨ãããåŋ čĻãĢåŋããϿпãĢįĩäēã§ããžãã
åæãŽæ°ãæ°ããåéĄã§ã¯ãä¸å¤Žããå¤å´ãĢåããŖãĻæĄåŧĩããĻãããã¯ããã¯ãããäŊŋį¨ãããžãã
int countPalindromes(const std::string& s) {
int count = 0;
for (int i = 0; i < s.length(); i++) {
// åĨæ°éˇãŽåæ
count += expandAroundCenter(s, i, i);
// åļæ°éˇãŽåæ
count += expandAroundCenter(s, i, i + 1);
}
return count;
}
int expandAroundCenter(const std::string& s, int left, int right) {
int count = 0;
while (left >= 0 && right < s.length() && s[left] == s[right]) {
count++;
left--;
right++;
}
return count;
}
ããŽãĸãããŧãã¯ãåĨæ°éˇã¨åļæ°éˇãŽä¸ĄæšãŽåæãčæ ŽããĻããžãã
æéˇåæé¨åæååãčĻã¤ããåéĄããä¸å¤ŽããæĄåŧĩãããã¯ããã¯ãäŊŋį¨ããžãã
std::string longestPalindromicSubstring(const std::string& s) {
if (s.empty()) return "";
int start = 0, maxLength = 1;
for (int i = 0; i < s.length(); i++) {
int len1 = expandAroundCenter(s, i, i);
int len2 = expandAroundCenter(s, i, i + 1);
int len = std::max(len1, len2);
if (len > maxLength) {
start = i - (len - 1) / 2;
maxLength = len;
}
}
return s.substr(start, maxLength);
}
int expandAroundCenter(const std::string& s, int left, int right) {
while (left >= 0 && right < s.length() && s[left] == s[right]) {
left--;
right++;
}
return right - left - 1;
}
ããŽãĸãããŧãã¯ãåæåīŧåĨæ°éˇīŧã¨åæåããĸīŧåļæ°éˇīŧãä¸åŋã¨ããĻæĄåŧĩããæéˇãŽåæãčĻã¤ããžãã
åæé¨ååãŽåéĄã¯ãéč¤ããé¨ååéĄããããããåįč¨įģæŗãäŊŋį¨ããžãã
int longestPalindromicSubsequence(const std::string& s) {
int n = s.length();
std::vector<std::vector<int>> dp(n, std::vector<int>(n, 0));
// ããšãĻãŽ1æåã¯éˇã1ãŽåæ
for (int i = 0; i < n; i++) {
dp[i][i] = 1;
}
// éˇã2äģĨä¸ãŽé¨ååãåãã
for (int len = 2; len <= n; len++) {
for (int i = 0; i < n - len + 1; i++) {
int j = i + len - 1;
if (s[i] == s[j] && len == 2) {
dp[i][j] = 2;
}
else if (s[i] == s[j]) {
dp[i][j] = dp[i+1][j-1] + 2;
}
else {
dp[i][j] = std::max(dp[i+1][j], dp[i][j-1]);
}
}
}
return dp[0][n-1];
}
ããŽåįč¨įģæŗãŽãĸãããŧãã¯ãé¨ååéĄãŽįĩæãäŋåãååŠį¨ãããã¨ã§åšįįãĢč§Ŗãæąããžãã
- æååãŽåčģĸ: į°Ąåã ãčŋŊå ãŽãĄãĸãĒãäŊŋį¨
- 2ã¤ãŽãã¤ãŗãŋ: åšįįã§čŋŊå ãŽãĄãĸãĒãäŊŋį¨ããĒã
- åæãŽæ°ãæ°ãã: ä¸å¤ŽããæĄåŧĩãããã¯ããã¯ãäŊŋį¨
- æéˇåæé¨åæåå: ä¸å¤ŽããæĄåŧĩãããã¯ããã¯ãäŊŋį¨
- åæé¨åå: åįč¨įģæŗãäŊŋį¨
ããããŽãã¯ããã¯ãéŠåãĢ鏿ãéŠį¨ãããã¨ã§ãæ§ã ãĒåæéĸéŖãŽåéĄãåšįįãĢč§Ŗæąēãããã¨ãã§ããžããåéĄãŽįšæ§īŧé¨åæåå vs é¨ååããĢãĻãŗã vs æéˇãĒãŠīŧãĢåŋããĻãæéŠãĒãĸãããŧãã鏿ãããã¨ãéčĻã§ãã