【发布时间】:2017-07-09 05:58:30
【问题描述】:
我参加了关于hackerearth的编码挑战,我被问到以下问题。
Alice 和 Bob 正在玩一个游戏,其中 Bob 给 Alice 一个长度为 NN 的由小写英文字母组成的字符串 SS,并要求她计算该字符串的子字符串的数量,该字符串正好包含 3 个元音。
这是我的代码
import java.io.BufferedReader;
import java.io.InputStreamReader;
class TestClass1{
public static void main(String args[] ) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
int N = Integer.parseInt(line);
String stringArray[]=new String[N];
for (int i = 0; i < N; i++) {
int len = Integer.parseInt(br.readLine());
stringArray[i]=br.readLine();
}
for (int i = 0; i < N; i++) {
System.out.println(determineNumberOfSubstring(stringArray[i]));
}
}
public static int determineNumberOfSubstring(String str)
{
int numberOfSubstring=0;
for(int i=0;i<str.length();i++)
{
int ctr=0;
for(int j=1;j<str.length()-i;j++)
{
String subString = str.substring(i,i+j);
if(subString.length()<3)
{
continue;
}
if(subString.contains("a")||subString.contains("e")||subString.contains("i")||subString.contains("o")||subString.contains("u")
||subString.contains("A")||subString.contains("E")||subString.contains("I")||subString.contains("O")||subString.contains("U"))
{
ctr+=3;
}
}
if(ctr==3){
numberOfSubstring++;
}
}
return numberOfSubstring;
}
} 我正在超出上述代码的时间限制。任何人都可以帮助我如何优化它。
更新1
代码按照@GhostCat 逻辑,需要测试,不是最终代码。
class TestClass1{
public static void main(String args[] ) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
int N = Integer.parseInt(line);
String stringArray[]=new String[N];
for (int i = 0; i < N; i++) {
int len = Integer.parseInt(br.readLine());
stringArray[i]=br.readLine();
}
for (int i = 0; i < N; i++) {
System.out.println(determineNumberOfSubstring(stringArray[i]));
}
}
public static int determineNumberOfSubstring(String str)
{
int numberOfSubstring=0;
int ctr=0;
int subStringStart=0;
Stack<String> s = new Stack<String>();
for(int i=0;i<str.length();i++)
{
if(isVowel(str.charAt(i)))
ctr++;
if(ctr==3)
{
numberOfSubstring++;
ctr=0;
if(s.empty())
s.push(str.substring(0,i));
else
s.push(new String(s.peek().substring(1,i+1)));
i=str.indexOf(s.peek().charAt(1))-1;
}
}
return numberOfSubstring;
}
private static boolean isVowel(char c) {
if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u'
||c=='A'||c=='E'||c=='I'||c=='O'||c=='U')
return true;
return false;
}
}
【问题讨论】:
-
@ghostcat 感谢您的帮助,目前我处于医疗紧急状态。我会尽快回复这个问题。
-
对您的更新的一些想法:使用
isVowel()是一个明显的改进,因为您的代码现在也更易于阅读。例如,您可以检查使用 Character.toLowerCase() 是否“更好”;这将比较次数减少了一半。或者如前所述,创建一个Set<Character> vowels = new HashSet<>(Arrays.asList('A, 'a', ...))并使用它的 contains() 方法。我不得不承认我没有得到你的堆栈解决方案的全部范围(我不确定你是否需要那个 - 所以你可以考虑让它更短;-) ...最后:请记住,这不是导师服务;所以:当你有更多时 -
问题,然后请提出一个新问题(或者我们谈论我为其他地方的支持提供导师建议 ;-)
标签: java string algorithm data-structures substring