【发布时间】:2016-12-16 03:20:55
【问题描述】:
输入规格
您的程序将占用 一个字符串 S 表示要测试的字符集。字母数字输入中的所有字母均为小写(1 ≤ LENGTH(S) ≤ 500)
输出规格
根据输入,打印出可以从输入中创建的唯一回文总数。 具体来说,假设我们有一个输入字符串“bbaa”,那么我们有回文“baab”,“abba”,那么输入字符串“bbaa”创建的回文总数是2。下面是我写的代码,然而,超过时间限制,算法效率不高。有人可以有一些方法来构建算法,以便我们提高效率吗?
这是我为这个问题写的:
import java.util.*;
import java.lang.*;
public class Problem
{
private static int count=0;
public static void main(String[] args)
{
Scanner stdin = new Scanner(System.in);
//int count=0;
while(stdin.hasNextLine())
{ String line=stdin.nextLine();
char[] line_char=line.toCharArray();
Arrays.sort(line_char);
StringBuilder strbuild=new StringBuilder("");
solve(line_char,new boolean[line_char.length],strbuild);
//System.out.println(stdin.nextLine());
}
System.out.println(count);
stdin.close();
}
public static void solve(char[] chararray,boolean[] used,StringBuilder strbuild){
if(strbuild.length()==chararray.length){
//System.out.println(strbuild.toString());
if(checkpalindrome(strbuild)){
count++;
}
}else{
char rec=(char)(chararray[chararray.length-1]+1);
for(int i=0;i<chararray.length;i++){
if(!used[i]&&rec!=chararray[i]){
rec=chararray[i];
strbuild.append(chararray[i]);
used[i]=true;
solve(chararray,used,strbuild);
strbuild.deleteCharAt(strbuild.length()-1);
used[i]=false;
}
}
}
}
public static boolean checkpalindrome(StringBuilder strbuild){
String str=strbuild.toString();
StringBuilder str1=new StringBuilder(strbuild);
return str.equals(str1.reverse().toString());
}
}
【问题讨论】:
-
假设我们只有一个输入字符串!这就是为什么我把 System.out.println(count);最后!
-
@GurwinderSingh - 不是真正的重复,因为允许 OP 重新排列输入字母。您链接到的问题是查找所有回文的子字符串。
-
回文必须使用所有的输入字母吗?我猜是这样,因为否则对于您的示例输入,您还会有回文“a”、“b”、“aa”和“bb”(更不用说空字符串,如果这被认为是回文)。但值得一问。
-
是的,我们需要使用输入字符串的所有字符
-
这应该在 Codereview 上。
标签: java string algorithm encoding