对于一个字符串,我们想通过添加字符的方式使得新的字符串整体变成回文串,但是只能在原串的结尾添加字符,请返回在结尾添加的最短字符串。
给定原字符串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;
}
}