解题思路:见https://blog.csdn.net/a769973411/article/details/80400792
本人转载并改为java
参考代码:
package dotcpp.字符串;
import java.util.HashSet;
import java.util.Scanner;
public class 切开字符串 {
static int length=100001;
//判断是否为回文串
public static boolean echoSubstr(String str)
{
for(int i =0;i<str.length()/2;i++)
{
if (str.charAt(i)!=str.charAt(str.length()-i-1))
return false;
}
return true;
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt() ;
String str,temp =" ";
str=scanner.next();
int[] echo =new int[length];//用于存储正回文子串的个数
int []notEcho=new int[length];//用于存储非正回文子串的个数
HashSet<String> e=new HashSet<>();
HashSet<String> ne=new HashSet<>();
//求正回文的个数
for (int i =0; i<n;i++)
{
for(int j=i;j>=0;j-=2)//注意这里为j-=2
{
int t= i-j+1;
temp=str.substring(j,j+t);
//判断是否是正回文子串,若是则插入集合,
//最后通过获取集合的size就可知去掉重复后的非正回文子串个数
boolean flag =echoSubstr(temp);
if(flag)e.add(temp);
}
echo[i]=e.size();
}
//求非正文子串
for (int i=n-1;i>=0;i--)
{
for(int j=i;j<n;j++)
{
//判断是否是正回文子串
boolean flag=false;
int t=j-i+1;
temp=str.substring(i,t+i);
//计算非正回文要先判断它是否是正回文子串
//因此将子串在正回文子串的集合中找是最节省资源的
if(temp.length()%2==1)
if(e.contains(temp))
flag=true;
if(!flag)ne.add(temp);
}
notEcho[i]=ne.size();
}
int result=0;
//求出最大值
for(int i=1;i<n;i++)
result=Math.max(result,echo[i-1]*notEcho[i]);
System.out.println(result);
}
}
0.0分
0 人评分
十->二进制转换 (C++代码)(零和负数需要特殊处理)浏览:1135 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:538 |
C语言训练-舍罕王的失算 (C++代码)(都给答案了还算什么)浏览:994 |
陶陶摘苹果 (C语言代码)浏览:1652 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:615 |
C语言训练-字符串正反连接 (C语言代码)浏览:664 |
C语言程序设计教程(第三版)课后习题9.4 (Java代码)浏览:1446 |
兰顿蚂蚁 (C++代码)浏览:1160 |
wu-理财计划 (C++代码)浏览:907 |
简单的a+b (C语言代码)浏览:529 |