問題 - 按照字典順序排列給定字符串的所有不同子字符串並連接它們。打印連接字符串的第K個字符。可以肯定的是,給定的K值將是有效的,即將有第K個字符不同子串的拼接
輸入格式 第一行將包含數字T即測試用例的數量。 每個測試用例的第一行包含一個包含字符串的字符(A-Z)和第二線將包含許多K.
輸出格式 打印第K個字符(串1索引)
約束 1≤T≤5 1≤length≤105 K將是一個適當的整數。
採樣輸入#00
1
dbac
3
樣本輸出#00
c
說明#00
的子串佈置在詞典順序時如下
一個,交流,b,ba,bac,c,d,db,dba,dbac 關於concate給他們,我們得到
aacbbabaccddbdbadbac 這個字符串中的第三個字符是c,因此答案。
這是我的代碼:
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
public class Solution
{
public static void gen(String str,int k)
{
int i,c;ArrayList<String>al=new ArrayList<String>();
for(c=0;c<str.length();c++)
{
for(i=1;i<=str.length()-c;i++)
{
String sub = str.substring(c,c+i);
al.add(sub);
}
}
HashSet hs = new HashSet();
hs.addAll(al);
al.clear();
al.addAll(hs);
String[] res = al.toArray(new String[al.size()]);
Arrays.sort(res);
StringBuilder sb= new StringBuilder();
for(String temp:res)
{
sb.append(temp);
}
String s = sb.toString();
System.out.println(s.charAt(k-1));
}
public static void main(String[] args)
{
Scanner sc = new Scanner (System.in);
int t = Integer.parseInt(sc.nextLine());
while((t--)>0)
{
String str = sc.nextLine();
int k = Integer.parseInt(sc.nextLine());
gen(str,k);
}
}
}
此代碼工作的很好像上面的測試情況下投入較小,但對大輸入的其超時或顯示這樣的事情我明白這個問題是與記憶,任何替代方法來做這個問題或反正重複使用相同的內存?
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Arrays.java:2694)
at java.lang.String.<init>(String.java:203)
at java.lang.String.substring(String.java:1913)
at Solution.gen(Solution.java:19)
at Solution.main(Solution.java:54)
即使在使用此代碼之後,它也需要超過4秒的時間才能編譯,所以測試用例沒有通過,但仍然爲此代碼添加坦克,我不需要將它們添加到列表和哈希集合中,並且不需要排序... i可以直接使用:) – coder101
所以我的回答是正確的。如果你使用的是正確的編程比賽,可能還不夠。對? – gfelisberto
是的,但不幸的是,它無法幫助我通過測試用例 – coder101