【问题标题】:how to count the number of palindromes formed by chars in a string?如何计算字符串中字符形成的回文数?
【发布时间】: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


【解决方案1】:

有一种更简单的计算回文数的方法。我不会为你编写代码,但我会描述方法。

由于您必须使用输入的所有字符,因此您最多可以有一个字符出现奇数次。因此,您应该首先检查该情况。如果有多个字母奇数,则答案必须为零。否则,取奇数字母(如果有的话)并想象它在输出字符串的中间。然后所有剩余的字母出现偶数次。但是现在生成回文相当于将每个字母的数量减少一半并生成这些字母的所有唯一排列。然后,每个排列都会有一个回文,由排列、中间的字母(如果适用)和排列的倒数组成。

因此,您所要做的就是计算一半字母的所有唯一排列(在处理单个奇数字母(如果存在)之后)。这应该比您当前的方法更容易更有效地完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 2011-09-09
    • 2022-12-21
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 2011-01-15
    相关资源
    最近更新 更多