给定一个字符串,你的任务是计算这个字符串中有多少个回文子串(回文串是一个正读和反读都一样的字符串)。
具有不同开始位置或结束位置的回文串,即使是由相同的字符组成,也会被计为是不同的子串。
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串(回文串是一个正读和反读都一样的字符串)。
具有不同开始位置或结束位置的回文串,即使是由相同的字符组成,也会被计为是不同的子串。
输入仅包含一个字符串,长度不会超过 1000。
输出仅包含一个非负整数, 代表输入字符串有多少个回文子串。
abc
3
aaa
6
import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String s = in.nextLine(); ArrayList<String> list = new ArrayList<>(); //longestPalindrome(s); for (int i = 0; i < s.length(); i++) { for (int j = i; j < s.length(); j++) { list.add(s.substring(i,j+1)); } } int cnt = 0; for(String temp : list) { if(isPalindrome(temp))cnt++; } System.out.println(cnt); } public static boolean isPalindrome(String s) { if(s.length() == 1) return true; StringBuilder sb = new StringBuilder(s); return sb.toString().equals(sb.reverse().toString()); } }
import java.util.Scanner;
/**
* @ClassName Main
* @Description TODO
* @Author Wlison
* @Date 2020/3/11 9:38
* @Version 1.0
**/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String s = sc.nextLine();
int res = 0;
for (int i = s.length(); i > 0; i--) {
for (int j = 0; j < s.length()-i+1; j++) {
String temp = s.substring(j,i+j);
if (judge(temp))res++;
}
}
System.out.println(res);
}
}
public static boolean judge(String s){
char[] chs = s.toCharArray();
int len = s.length();
for (int i = 0; i < chs.length; i++) {
if (chs[i]!=chs[len-i-1])return false;
}
return true;
}
} import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
String s = scanner.next();
int cnt = 0;
boolean[][] dp = new boolean[s.length()][s.length()];
for(int i = s.length() - 1; i >= 0; i--){
for(int j = i; j < s.length(); j++){
if(i == j){
dp[i][j] = true;
}else if(i + 1 == j && s.charAt(i) == s.charAt(j)){
dp[i][j] = true;
}else{
dp[i][j] = dp[i + 1][j - 1] && s.charAt(i) == s.charAt(j);
}
if(dp[i][j])
cnt++;
}
}
System.out.println(cnt);
}
} dp[i][j]: 从下标 i 到 j 构成的字符串是否是回文串
import java.util.Scanner;
public class Main{
public int helper(String str) {
int[] dp = new int[str.length()];
dp[0] = 1;
for (int i=1;i<str.length(); i++) {
for (int j=0;j<=i;j++) {
dp[i] += isPalindrome(str.substring(j,i+1));
}
dp[i] += dp[i-1];
}
return dp[str.length()-1];
}
private int isPalindrome(String str) {
if (str.length()==1) return 1;
int i=0, j = str.length()-1;
while(i<=j) {
if (str.charAt(i++) != str.charAt(j--)) return 0;
}
return 1;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str1=null;
while (in.hasNext()) {
str1 = in.next();
}
int res = new Main().helper(str1);
System.out.println(res);
}
} #include <iostream>
#include <set>
#include <string>
#include <string.h>
using namespace std;
typedef pair<int, int> ValueType;
void judgeABA(const string &str, const int _max, int start, set<ValueType> &res)
{
int q = start - 1, p = start + 1;
while (q >= 0 && p < _max && str[q] == str[p])
{
res.insert(make_pair(q, p));
q--;
p++;
}
}
void judgeAA(const string &str, const int _max, int start, set<ValueType> &res)
{
int q = start, p = start + 1;
while (q >= 0 && p < _max && str[q] == str[p])
{
res.insert(make_pair(q, p));
q--;
p++;
}
}
int main()
{
string str;
cin >> str;
set<ValueType> res;
int len = str.length();
for (int idx = 0; idx < len; ++idx)
{
judgeAA(str, len, idx, res);
judgeABA(str, len, idx, res);
}
cout<<res.size() + len;
return 0;
} import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
System.out.println(centerSpread(str));
}
/**
* 中心扩散法
*/
private static int count;
private static int centerSpread(String str) {
for (int i = 0; i < str.length(); i++) {
helper(str, i, i);
helper(str, i, i + 1);
}
return count;
}
private static void helper(String str, int left, int right) {
while (right < str.length() && left >= 0 && str.charAt(left) == str.charAt(right)) {
left--;
right++;
count++;
}
}
}
s = input().strip() def countSubstrings(s): n = len(s) dp = [[False] * n for _ in range(n)] count = 0 for j in range(n): for i in range(0, j + 1): length = j - i + 1 if length == 1: dp[i][j] = True count += 1 if length == 2 and s[i] == s[j]: dp[i][j] = True count += 1 if length > 2 and s[i] == s[j] and dp[i+1][j-1] is True: dp[i][j] = True count += 1 return count print(countSubstrings(s))
import java.util.Scanner;
public class Main{
public int numOfHuiwen(String s){
int res = 0;
if(s == null || s.length()==0) return res;
for(int i=0;i<s.length();i++){
res+=centerSpread(s,i,i);
res+=centerSpread(s,i,i+1);
}
return res;
}
public int centerSpread(String s, int i, int j){
int count = 0;
while(i>=0 && j<s.length()){
if(s.charAt(i)==s.charAt(j)){
count++;
i--;
j++;
}
else break;
}
return count;
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String s = sc.next();
Main so = new Main();
int res = so.numOfHuiwen(s);
System.out.println(res);
}
}
public static boolean justify(String input) {
int head = 0;
int tail = input.length() - 1;
while(head < tail) {
if(input.charAt(head) == input.charAt(tail)) {
head++;
tail--;
}else {
return false;
}
}
return true;
}
public static int collect(String input) {
int output = 0;
for(int i = 0; i <= input.length(); i++) {
for (int j = i + 1; j <= input.length(); j++) {
if(justify(input.substring(i, j))) {
output++;
}
}
}
return output;
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while(input.hasNext()) {
String s = input.nextLine();
System.out.println(collect(s));
}
}
import java.util.Scanner;
//中心扩散法
public class Main {
public static int count = 0;
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
String str = s.nextLine();
for(int i=0;i<str.length();i++){
checkVaild(str,i,i);
checkVaild(str,i,i+1);
}
System.out.println(count);
}
public static void checkVaild(String str,int left,int right){
while(left>=0 && right<str.length() && str.charAt(left) == str.charAt(right)){
left--;
right++;
count++;
}
}
}
#include<cstdio>
#include<cstring>
int main(){
char s[1005];
scanf("%s",s);
int count=0,len = strlen(s);
for(int i=0; i<len ;i++){
for(int j=len-1; j>=i; j--){
int a,b;
for(a=i,b=j; a<=b && s[a]==s[b]; a++,b--);
if(a>b) count++;
}
}
printf("%d",count);
return 0;
} import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String a = sc.nextLine();
char[] text = a.toCharArray();
int hwNum = text.length;
for (int i = 0; i < text.length-1; i++) {
for (int j = i+1; j < text.length; j++) {
boolean flag = judgeHw(text,i,j);
if(flag) {
hwNum++;
}
}
}
System.out.println(hwNum);
}
private static boolean judgeHw(char[] text, int i, int j) {
while(i < j) {
if(text[i++] != text[j--]) {
return false;
}
}
return true;
}
} import java.util.*;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
String s = in.nextLine();
int res = 0;
//dp[i][j] 代表从index i 到j是否是回文子串
boolean dp[][] = new boolean[s.length()][s.length()];
for (int i = 0; i < s.length(); i++) {
for (int j = 0; j <= s.length() - i - 1; j++) {
//两边的字符相等,则判断中间是否为回文。
if (s.charAt(j) == s.charAt(i + j)) {
if(i < 2 || dp[j+1][j+i-1]){
dp[j][i+j] = true;
res++;
}
}
}
}
System.out.println(res);
}
} import sys s=sys.stdin.readline().strip() n=len(s) dp=[1]*n #动态规划+真儿八斤的回文情况 for i in range(1,n): if s[i-1]!=s[i]:(3345)#不相等即无法构成回文,只能单字 dp[i]=dp[i-1]+1#动态规划第二个与前一个不相同 a\ab\abc的普通情况 for k in range(i):(3346)#a\ab\aba 或者noon或者level情况 te=s[k:i+1] if te==te[::-1]: dp[i]=dp[i]+1 else: j=i count=2 while j>1:#a\aa\aaa\abaa第二个字符与前一个相同的情况(看相同几次) if s[j-1]==s[j-2]: count+=1 j-=1 else: break dp[i]=dp[i-1]+count print(dp[-1])
| |
import java.util.*;
public class Main {
public static boolean isrestr(String str){
StringBuilder stringBuilder = new StringBuilder(str);
if(stringBuilder.reverse().toString().equals(str)){
return true;
}else {
return false;
}
}
public static void main(String[] args) {
// //滑动窗口
int len = 1;
int count = 0;
Scanner in = new Scanner(System.in);
String str = in.nextLine();
for(len=1;len<=str.length();len++) {
for (int i = 0; i < str.length(); i++) {
if((i+len)>str.length())break;
String now = str.substring(i,i+len);
if(isrestr(now)==true){
count++;
}
}
}
System.out.println(count);
}
}