对于一个字符串,我们想通过添加字符的方式使得新的字符串整体变成回文串,但是只能在原串的结尾添加字符,请返回在结尾添加的最短字符串。
给定原字符串A及它的长度n,请返回添加的字符串。保证原串不是回文串。
测试样例:
"ab",2
返回:"a"
string addToPalindrome(string A, int n) { string s = A; reverse(s.begin(),s.end()); // 取得翻转串 for(int i=0;i<n;i++) // Naive查找 if(A.substr(i,n-i)==s.substr(0,n-i))//求最长公共子串 return s.substr(n-i,i);//返回公共集后面剩余字符串 return string(""); }
//每次删除掉第一个字符,将这个删除掉的字符放入一个新串中 //如果删除后的字符串是回文串则返回,否则继续第一步 //逆序ans返回 class Palindrome { bool judge(string str){ string tmp = str; reverse(tmp.begin(), tmp.end()); return tmp==str; } public: string addToPalindrome(string str, int n) { reverse(str.begin(), str.end()); string ans; while (!str.empty()) { ans.push_back(str.back()); str.pop_back(); if(judge(str)) break; } reverse(ans.begin(), ans.end()); return ans; } };
将字符串反转后求最大交集(原字符从后往前,反转的字符从前往后),反转后的字符串另外部分就是要求的字符串。
}
//因为只能从最后添加,所以从后往前找,包含最后一个字符的最长回文字串。 //动态规划复杂度也是n方暴力求解也是n方
class Palindrome { public: bool ispalindrome(string A,int start,int end){ //判断字符串A的区间start到end是否为回文串 while(start<=end){ if(A[start]!=A[end]) return false; start++; end--; } return true; } string addToPalindrome(string A, int n) { int i=0,j=0; //从头开始找,如果找到当前字符等于最后一个字符,判断这个区间是否为回文串 for(;i<n-1;i++){ if(A[i]==A[n-1] && ispalindrome(A,i,n-1)) break; } string result = A; //返回的答案为非回文串区间的逆序 for(;j<i;j++) result[j] = A[i-j-1]; result[j] = '\0'; return result; } };
import java.util.*; public class Palindrome { public String addToPalindrome(String A, int n) { // write code here StringBuilder temp=new StringBuilder(A); String B=temp.reverse().toString(); for(int i=0;i<A.length();i++){ String sub1=A.substring(i); String sub2=B.substring(0,n-i); if(sub1.equals(sub2) && !sub1.equals("")) return new StringBuilder(A.substring(0,i)).reverse().toString(); } return new StringBuilder(A).toString(); } }
#把字符串拆成两部分 #例如abcdd:从a,bcdd查找右边的是否为回文串,如果不是则再向右移动切割 # 然后ab,cdd查找 # 再然后abc,dd查找到dd为回文串,逆序返回此时左边的字符串(cba)。 #所以最大一定先找到被返回 class Palindrome: def addToPalindrome(self, A, n): if n == 2: return A[0] for i in range(1,n): #从开头一个一个查找剩余的字符串是否为回文串 temp = A[i:] if temp == temp[::-1]: return A[i-1::-1]
import java.util.*; public class Palindrome { public String addToPalindrome(String A, int n) { // write code here int index=0; for(int i=0; i<n; i++){ int left=i; //定义俩指针 int right=n-1; while(left<=right){ //判断俩指针之间是否为回文串 if(A.charAt(left)==A.charAt(right)){ left++; right--; }else break; } if(left-right==1 || left-right==2){ //如果俩指针之间为回文串,则返回头指针 index=i; break; } } StringBuilder str=new StringBuilder(A.substring(0, index)); //做发转字符串 return str.reverse().toString(); } }
//怎么说呢,1、找到方向-----动规-----原串 str1 = abcdedc翻转串 str2 = cdedcba便利str1 找到一个i,使得从i到最后(一共n-i-1个),然后和str2的前n-i-1个相同。if(str1.substr(i,n-i)==str2.substr(0,n-i)) return str2.substr(n-i,i);最长子串?????可能吧。符代码如下:class Palindrome { public: string addToPalindrome(string A, int n) { string s = A;int num_diff; string S = ""; reverse(s.begin(),s.end()); for(int i = 0;i<n;i++) if(A.substr(i,n-i)==s.substr(0,n-i)) return s.substr(n-i,i); return S; } };
1 找出原串中以原串最后一个字符结尾的最长的回文串(的长度) 1.1 dp[i][j]代表i到j回文串的长度,如果不是回文串为0 1.2 当a[i]==a[j]的时候更新dp[i][j] 1.3 取最值:只用取以原串最后一个字符结尾的回文串 2 截取1找出的回文串之前的子串 import java.util.*; public class Palindrome { public String addToPalindrome(String A, int n) { // write code here int[][] dp = new int[n][n]; int max = 1; //1 for (int i = 0; i < n; ++i) { dp[i][i] = 1; } char[] a = A.toCharArray(); for(int i=n-2;i>=0;i--){ for(int j=i+1;j<n;j++){ if(j-1>=0&&a[i]==a[j] &&(j==i+1||dp[i+1][j-1]!=0)) dp[i][j] = 2+dp[i+1][j-1]; if(dp[i][j]>max && j==n-1) max=dp[i][j]; } } //2 return new StringBuilder(A.substring(0, n - max)).reverse().toString(); } }
import java.util.*; public class Palindrome { public String addToPalindrome(String A, int n) { // write code here char[] cs = A.toCharArray(); int i = 0; int j = n - 1; int index = -1; while (i <= j) { if (cs[i] == cs[j]) { ++i; --j; } else { if (j == n - 1) ++i; j = n - 1; index = i; } } if (index == -1) return ""; else { return new StringBuilder(A.substring(0, index)).reverse().toString(); } } }
public String addToPalindrome(String A, int n) {
char[] a = A.toCharArray(); int answer = 0; String str = ""; boolean flag = true; for(int i = 0;i < a.length - 1;i++){ flag = true; if(a[a.length - 1] != a[i]){ answer ++; }else{ for(int j = 1;j < a.length - i;j++){ if(a[a.length - j - 1] != a[i + j]){ answer++; flag = false; break; } } if(flag == true){ break; } } } for(int x = answer - 1;x >= 0;x--){ str += a[x]; } return str; }
import java.util.*; public class Palindrome { public String addToPalindrome(String A, int n) { // write code here String returnStr=A.charAt(0)+""; String temp; for(int i=1;i<A.length();i++){ temp=A.substring(i,A.length()); if(checkIsHW(temp)){ break; } returnStr=A.charAt(i)+returnStr; } return returnStr; } //判断是否是回文 public boolean checkIsHW(String substr){ if(substr.length()<=1){ return true; } int length=substr.length(); for(int i=0;i<length/2;i++){ if(substr.charAt(i)!=substr.charAt(length-i-1)){ return false; } } return true; } }