从here得到了这个问题。但是我能算出的算法运行时非常糟糕。这是一个问题:
如果s的所有字符都不同,则字符串s称为唯一。 字符串s2可以从字符串s1生成,如果我们可以删除一些 s1的字符来获得s2。
如果s1的长度更长,则字符串s1比字符串s2更漂亮 比s2的长度或它们的长度相等,s1是 字典上大于s2。
给定一个字符串s,你必须找到最漂亮的唯一字符串 可以从s。
生产输入:第一行输入来自一个不超过的字符串 1,000,000(10 ^ 6)个字符。 s的所有字符都是小写的 英文字母。
输出:打印可生成的最美丽的唯一字符串 小号
示例输入:babab
样品输出:ba
我做的是这个:
我想要一个正确有效的算法,当输入字符串真的很大时,它可以缩放。
答案 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
}