小易得到了一个仅包含大小写英文字符的字符串,该字符串可能不是回文串。(“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串,“asds”就不是回文串。)
小易可以在字符串尾部加入任意数量的任意字符,使其字符串变成回文串。
现在请你编写一个程序,程序要能计算出小易可以得到的最短回文串。
小易得到了一个仅包含大小写英文字符的字符串,该字符串可能不是回文串。(“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串,“asds”就不是回文串。)
小易可以在字符串尾部加入任意数量的任意字符,使其字符串变成回文串。
现在请你编写一个程序,程序要能计算出小易可以得到的最短回文串。
一行包括一个字符串。
一行包括一个字符串,代表答案。
noon
noon
noo
noon
helloworld
helloworldlrowolleh
def ss_ss(ss,reversed_s): ss1 = [] len_reversed_s = len(reversed_s) for i in range(len_reversed_s): str1 = reversed_s[i+1: len(reversed_s)+1] if s + str1 == ''.join(reversed(s + str1)): ss = s + str1 ss1.append(ss) print(min(ss1,key = len)) return True if __name__ == '__main__': s = input() reversed_s = s[::-1] if s == reversed_s: print(s) else: ss = s + reversed_s if ss_ss(ss,reversed_s) is not True: print(ss)
str = input().strip() str1 = '' str2 = '' n = len(str) list1, list2 = [], [] for i in str[::-1]: str1 += i if str1 == str: print(str) else: for i in range(n): list1.append(str[i]) if str[i+1:] == str1[:(-i-1)]: break list1.reverse() for i in range(len(list1)): str += list1[i] print(str)小白一枚 仅仅有个思路代码写的不够专业,请各位大神指点
s = input().strip() # 左右边界 l, r = 0, len(s) - 1 # mark记录回文部分的开始位置 mark = -1 while l <= r: # 从两端开始检查,如果两端的字符相等,则l指针向右移动,r指针向左移动 if s[l] == s[r]: mark = l if mark == -1 else mark l += 1 r -= 1 continue # 否则原始字符串不是回文串 if mark != -1: l = mark + 1 mark = -1 r = len(s) - 1 else: l += 1 # 如果mark是0,表示原来的字符串就是回文串(回文串从索引0开始) if mark >= 0: # mark大于0的时候就要将0~mark-1的部分反转后拼接在原始字符串后面 s += s[:mark][::-1] else: # 如果mark是-1,则表示原始字符串完全没有回文的部分,直接将原始字符串反转拼接在后面 s += s[:-1][::-1] print(s)
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; bool judge(string& s, int l, int r) { bool ret = true; while(l<r) { if(s[l]!=s[r]) { ret = false; break; } l++; r--; } return ret; } int main() { string s; int n,t; cin>>s; n=s.size(); t=n-1; for(int i=n-1;i>=0;i--) { if(judge(s,i,n-1)) { t=i; } } for(int i=t-1;i>=0;i--) s+=s[i]; cout<<s<<endl; return 0; }
#include<iostream> using namespace std; // 判断s[index:]是否回文 bool isPalindrome(string& s, int index, int size){ for(int i = index, j = size-1; i <= j; i++, j--){ if(s[i] != s[j]) return false; } return true; } int main(){ string s; cin >> s; int size = s.size(); for(int i = 0; i < size; i++){ if(isPalindrome(s, i, size)){ cout << s; break; } s.insert(s.begin() + size, s[i]); } return 0; }
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.nextLine(); StringBuffer sf = new StringBuffer(str); StringBuffer tmp = new StringBuffer(str); tmp = tmp.reverse(); //先判断 本身是否是一个回文串 if(tmp.toString().equals(sf.toString())) { System.out.println(str); return; } //遍历字符串 每次在len下标添加str.charAt[i] 建议画图 一画图就会了 //值得注意的是StringBuffer和SringBuilder都没有equals()方法 要转化为字符串 //并且要使用tmp来逆置字符串 因为使用sf来逆置字符串 那么sf本身也被逆置了 int len = str.length(); for(int i = 0;i < str.length();i++) { sf.insert(len,str.charAt(i)); tmp = new StringBuffer(sf); tmp = tmp.reverse(); if(tmp.toString().equals(sf.toString())) { break; } } System.out.println(tmp); } }
#include <iostream> #include <vector> #include <algorithm> using namespace std; bool test(string str) { string rev = str; reverse(rev.begin(), rev.end()); return rev == str; } int main() { string input; cin >> input; string rev = input; string output = input; string s = input; reverse(rev.begin(), rev.end()); int index = 0; string add; //cout << input.substr(0,1) << endl; while (!test(output)) { output = input; add = input.substr(0, index); reverse(add.begin(), add.end()); output += add; index++; } cout << output << endl; return 0; }
s=input() revs=s[::-1] #helol的最后两位 loleh首两位 相等 则拼接它们 for i in range(len(s)): if s[i:]==revs[:len(s)-i]: print(s+revs[len(s)-i:]) break
s = input() if len(s) == 1: print(s) def checkPalindrome(string): if len(string) == 1: return True deque = [i for i in string] flag = True while len(deque) > 1 and flag: if deque.pop(0) == deque.pop(): pass else: flag = False return flag if checkPalindrome(s): print(s) else: symmetry = s[-1] temp = '' for i in range(len(s) - 1, -1, -1): temp += s[i] if checkPalindrome(temp): if len(temp) > len(symmetry): symmetry = temp if len(symmetry) == 1: sym_part = s[:len(s) - 1] reversed_sym_part = sym_part[::-1] print(s + reversed_sym_part) else: palinlen = len(s) symlen = len(symmetry) sym_part = s[:palinlen - symlen] reversed_sym_part = sym_part[::-1] print(s + reversed_sym_part)
写个暴力解 (go语言) O(n2) 优解LC 214 package main import "fmt" func isPalind(s string) bool { for i, j := 0, len(s) - 1; i < j; i, j = i + 1, j - 1 { if (s[i] != s[j]) { return false; } } return true; } func reverse(t string) string { s := []byte(t) for i, j := 0, len(s) - 1; i < j; i, j = i + 1, j - 1 { s[i], s[j] = s[j], s[i] } return string(s) } func main() { var s string fmt.Scanln(&s) n := len(s) for i := 0; i < n; i++ { if (isPalind(s[i:n])) { s += reverse(s[:i]) fmt.Println(s) break; } } }
// C++字符串哈希(O(n)) #include<iostream> #include<string> #include<algorithm> using namespace std; using ull = unsigned long long; ull mod = 1e9 + 7; int main() { string s; cin >> s; int pos = s.size() - 1; if (s.empty()) cout << " " << endl; ull base = 131, buff = 1; ull left = 0, right = 0; for (int i = s.size() - 1; i >= 0; --i) { (left = left * base + s[i]) %= mod; (right = right + buff * s[i]) %= mod; if (left == right) pos = i; (buff *= base) %= mod; } string str = s.substr(0, pos); reverse(str.begin(), str.end()); s += str; cout << s << endl; return 0; }
import java.util.Scanner; public class Main { public static void main(String args[]) { Scanner sc = new Scanner(System.in); StringBuffer sb = new StringBuffer(); sb.append(sc.nextLine()); int le = sb.length(); if (le <= 2) { System.out.println(le==2?(sb.charAt(0)==sb.charAt(1)?sb:sb+String.valueOf(sb.charAt(0))):sb); } else { int max = 0; int start = 0; int end = 0; int[][] dp = new int[le][le]; for (int i = 0; i < le; i++) { for (int j = 0; j < i; j++) { if (sb.charAt(j) == sb.charAt(i) && (i - j < 2 || dp[j + 1][i - 1] > 0)) { dp[j][i] = i - j + 1; if (dp[j][i] > max) { start = j; end = i; } } } } if (start == 0 && end == le - 1) { System.out.println(sb); } else if (end == le - 1) { System.out.println(sb + sb.reverse().substring(le - start)); } else { System.out.println(sb + sb.reverse().substring(1)); } } } }
line=readline(); function huiwen(Strs){ //检测是否为回文的函数 var str = Strs; var flag= true; var a = str.split(''); var b = a.concat().reverse(); a.forEach(function(val,ind){ if(val!=b[ind]){ flag=false; return false; } }) if(flag){ return str; } return false; } var word = line; //构造回文 for(let j=0;j<line.length;j++){ if(huiwen(word)){ print(huiwen(word)); break; } var arr=word.split(''); arr.splice(line.length,0,arr[j]); word = arr.join(''); }
逆序
原串,寻找 前缀
,简单易懂 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.nextLine(); // 逆序原字符串 String reverse = new StringBuffer(s).reverse().toString(); String ans = ""; int len = Integer.MAX_VALUE; if(judge(s)) { System.out.println(s); } else { for(int i=0;i<reverse.length();i++){ // 寻找r对应s的前缀 /** i s(YCiC) r(CiCY)的前缀 0 YCiC no 1 CiC yes:CiC CiC后追加(Y) Y的index=r.length()-i */ if(reverse.startsWith(s.substring(i))){ String tmp = s+reverse.substring(reverse.length()-i); if (tmp.length() < len) { len = tmp.length(); ans = tmp; } // 为什么不直接输出呢?因为可能会有多个输出,我要输出最短的那个 // System.out.println(s+reverse.substring(reverse.length()-i)); } } System.out.println(ans); } } public static boolean judge(String s) { int left = 0, right = s.length() - 1; while(left <= right) { if(s.charAt(left) == s.charAt(right)) { left++; right--; } else { return false; } } return true; } }
import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String cur = in.next(); int length = cur.length(); int start = 0; int end = length-1; boolean huiwen = true; while(start!=end){ for(int i=start,j=end;i<=j;i++,j--){ if(cur.charAt(i)!=cur.charAt(j)) { huiwen = false; break; }else if(i==j-1) huiwen = true; } if(huiwen){ for(int i=start-1;i>=0;i--) cur += cur.charAt(i); System.out.print(cur); return; } start++; } for(int i=start-1;i>=0;i--) cur += cur.charAt(i); System.out.print(cur); } }