给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000
每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
aaaa abab
4 3
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int MAX=110000+10; char s[MAX*2]; int p[MAX*2]; int main(){ while(scanf("%s",s)!=EOF){ int len=strlen(s),id=0,maxlen=0; for(int i=len;i>=0;--i) s[i+i+2]=s[i],s[i+i+1]='#'; s[0]='*'; for(int i=2;i<2*len+1;++i){ if(p[id]+id>i)p[i]=min(p[2*id-i],p[id]+id-i); else p[i]=1; while(s[i-p[i]]==s[i+p[i]]) p[i]++; if(id+p[id]<i+p[i]) id=i; if(maxlen<p[i]) maxlen=p[i]; } printf("%d\n",maxlen-1); } }
#include<iostream> #include<vector> #include<algorithm> #include<string> using namespace std; string maxHui(string s) { int len = s.length(); if(len <= 1) return s; string s2 = s; reverse(s2.begin(), s2.end()); vector<vector<int>> dp(len+1, vector<int>(len+1, 0)); int res = 0, pos = 0; for(int i = 1; i <= len; i++) { for(int j = 1; j < len+1; j++) { if(s[i-1] == s2[j-1]) dp[i][j] = dp[i-1][j-1] + 1; if(res <= dp[i][j]) { res=dp[i][j]; pos = i-1; } } } return s.substr(pos-res+1, res); } int main() { string str; while(getline(cin, str)) cout << maxHui(str) << endl; return 0; }
import java.util.Scanner; public class Main{ public static char[] generateArray(String str){ char[] res = new char[2 * str.length() + 1]; int index = 0; for(int i = 0; i < res.length;i++){ res[i] = (i & 1) == 0 ? '#':str.charAt(index++); } return res; } public static int Manacher(String str){ char[] charArr = generateArray(str); int C = -1; int R = -1; int max = Integer.MIN_VALUE; int[] pArr = new int[charArr.length]; for(int i = 0 ;i < charArr.length;i++){ pArr[i] = R > i ? Math.min(R-i,pArr[2 * C - i]) : 1; while(i + pArr[i] < pArr.length && i - pArr[i] >= 0){ if(charArr[i + pArr[i]] == charArr[i - pArr[i]]) pArr[i]++; else break; } if(i + pArr[i] > R){ R = i + pArr[i]; C = i; } max = Math.max(max,pArr[i]); } return max - 1; } public static void main(String args[]){ Scanner sc = new Scanner(System.in); while(sc.hasNext()){ String str = sc.next(); System.out.println(Manacher(str)); } } }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { String string = (String) scanner.next(); System.out.println(getLongestPalindrome(string, string.length())); } } public static int getLongestPalindrome(String A, int n) { if(A==null) return 0; char []ch=A.toCharArray(); int max=0; for(int i=0;i<n;i++){ //先用奇数长度来进行判断 int len=0; for(int j=0;(i-j)>=0&&(i+j)<n;j++){ if(ch[i-j]!=ch[i+j]) break; len=2*j+1; } if(len>max) max=len; //用偶数长度进行一次判断 for(int j=0;(i-j)>=0&&(i+j+1)<n;j++){ if(ch[i-j]!=ch[i+j+1]) break; len=2*j+2; } if(len>max) max=len; } return max; } }
大家好,请问我的代码提示内部错误,可是在电脑上可以运行是怎么回事? public class HuiWen { public static void main(String[] args) { Scanner sc=new Scanner(System.in); while(sc.hasNext()){ String line=sc.nextLine(); if(line==null) return; int i=line.length(); // int max=0; while(i>=0){ if(isPalindrom(line.substring(0, i))){ System.out.println(i); break; }else i--; } } } public static boolean isPalindrom(String str){ StringBuffer buf1=new StringBuffer(str); StringBuffer buf2=buf1.reverse(); return buf2.toString().equals(str); } }
import java.util.Scanner;
/**
* https://www.nowcoder.com/questionTerminal/edb0f0cc3ffd495bb4826caef5ce9104
*/
public class Main {
public static char[] manacherString(String str) {
char[] charArr = str.toCharArray();
char[] res = new char[str.length() * 2 + 1];
int index = 0;
for (int i = 0; i != res.length; i++) {
res[i] = (i & 1) == 0 ? '#' : charArr[index++];
}
return res;
}
public static int maxLcpsLength(String str) {
if (str == null || str.length() == 0) {
return 0;
}
char[] charArr = manacherString(str);
int[] pArr = new int[charArr.length];
int index = -1;
int pR = -1;
int max = Integer.MIN_VALUE;
for (int i = 0; i != charArr.length; i++) {
pArr[i] = pR > i ? Math.min(pArr[2 * index - i], pR - i) : 1;
while (i + pArr[i] < charArr.length && i - pArr[i] > -1) {
if (charArr[i + pArr[i]] == charArr[i - pArr[i]])
pArr[i]++;
else {
break;
}
}
if (i + pArr[i] > pR) {
pR = i + pArr[i];
index = i;
}
max = Math.max(max, pArr[i]);
}
return max - 1;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String str = sc.next();
System.out.println(maxLcpsLength(str));
}
}
}
Manacher算法实现
超时间了,不知道怎么改 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { String string = in.next(); if(string==null){ continue; } int max = 0; for (int i = 0; i < string.length(); i++) { String sub; for (int j = i + 2; j <= string.length(); j++) { sub = string.substring(i, j); if (isHuiWen(sub)) { if (max < sub.length()) max = sub.length(); } } } System.out.println(max); } } public static boolean isHuiWen(String string) { boolean flag = true; char[] cs = string.toCharArray(); int n = cs.length; for (int i = 0; i < n / 2; i++) { if (cs[i] != cs[n - i - 1]) { flag = false; } } return flag; } }
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=110005; char str1[maxn],str2[2*maxn+1]; int pArr[2*maxn+1]; void init(int len){ int l=len*2+1,j=0; for(int i=0;i<l;i++){ if(i%2==0){ str2[i]='#'; } else{ str2[i]=str1[j++]; } } str2[l]='\0'; } int main(){ //freopen("in.txt","r",stdin); int n,m,pR,index,Max; while(scanf("%s",str1)==1){ n=strlen(str1); pR=0,index=0,Max=0; init(n); m=n*2+1; for(int i=0;i<m;i++){ pArr[i]=pR>i?min(pArr[2*index-i],pR-i):1; while(i+pArr[i]<m&&i+pArr[i]>-1){ if(str2[pArr[i]+i]==str2[i-pArr[i]]){ pArr[i]++; } else{ break; } } if(pArr[i]+i>pR){ pR=pArr[i]+i; index=i; } Max=max(Max,pArr[i]); } printf("%d\n",Max-1); } return 0; }