美丽的字符串

时间:2013-07-18 13:39:31

标签: algorithm language-agnostic

here得到了这个问题。但是我能算出的算法运行时非常糟糕。这是一个问题:

  

如果s的所有字符都不同,则字符串s称为唯一。   字符串s2可以从字符串s1生成,如果我们可以删除一些   s1的字符来获得s2。

     

如果s1的长度更长,则字符串s1比字符串s2更漂亮   比s2的长度或它们的长度相等,s1是   字典上大于s2。

     

给定一个字符串s,你必须找到最漂亮的唯一字符串   可以从s。

生产      

输入:第一行输入来自一个不超过的字符串   1,000,000(10 ^ 6)个字符。 s的所有字符都是小写的   英文字母。

     

输出:打印可生成的最美丽的唯一字符串   小号

     

示例输入:babab

     

样品输出:ba

我做的是这个:

  1. 取出字符串并删除所有相等的相邻字符。示例:输入:“bbbbbab”输出:“bab”,这是此步骤的输出。这成为下一步的输入。
  2. 现在为字符串中的每个唯一字符构建一个数组。该数组将在给定的输入数组中包含其出现的索引。
  3. 注意每个元素的第一次出现。找出出现的最小值和最大值。对所有可能的字符串使用此迭代,这些字符串可以使用以索引max结尾的单词形成。按字典顺序排列。
  4. 通过移动最大
  5. 重复上述步骤

    我想要一个正确有效的算法,当输入字符串真的很大时,它可以缩放。

2 个答案:

答案 0 :(得分:4)

这是一组implementations,如果这些效率太低,请使用repo并使它们更有效率。

答案 1 :(得分:1)

以下是查找Beautiful substring的程序。它是完全优化的代码,使用动态编程的复杂性较低。

static String LCSubStr(String X,String Y, int m, int n)// Longest Common substring
{
      int LCSarr[][]=new int[m+1][n+1];
      int max = 0; 
      int max_index=0;
      for (int i=0; i<=m; i++)
      {
          for (int j=0; j<=n; j++)
          {
                if (i == 0 || j == 0)
                LCSarr[i][j] = 0;

                else if (X.charAt(i-1) == Y.charAt(j-1))//if char matches
                {
                     LCSarr[i][j] = LCSarr[i-1][j-1] + 1;
                     if(max < LCSarr[i][j])
                     {
                           max=LCSarr[i][j];
                           max_index=i; //Index points at which last char matched
                      }
                 }
                 else LCSarr[i][j] = 0;
           }
       }
       return (X.substring(max_index-max,max_index));

     }

     public static void main(String[] args)
     {
             Scanner sc=new Scanner(System.in);

             System.out.print("Enter String 1:  ");
             String str=new String(sc.nextLine());
             str=str.toLowerCase();
             String temp2="";//string with no duplicates
             HashMap<Integer,Character> tc = new HashMap<Integer,Character>();//create a hashmap to store the char's
             char [] charArray = str.toCharArray();
             for (Character c : charArray)//for each char
             {
                  if (!tc.containsValue(c))//if the char is not already in the hashmap
                  {
                       temp2=temp2+c.toString();//add the char to the output string
                       tc.put(c.hashCode(),c);//and add the char to the hashmap
                  }
              }
              System.out.print("\nBeatiful substring of given String is:  ");
              System.out.println(LCSubStr(str,temp2,str.length(),temp2.length()));//Find Longest common substring which gives us actually beautiful string
      }