Я принимал участие в вызове кодирования на hackerearth, и мне задали следующий вопрос.Количество подстрок строки, которая имеет три гласных
Алиса и Боб играют в игру, в которой Боб дает строку SS длиной NN, состоящему из строчных букв английского алфавита к Алисе и попросить ее, чтобы вычислить количество подстроки этой строки, которая содержит ровно три гласные.
Это мой код
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;
}
} Иам получение лимит времени превышен в коде выше. Может ли кто-нибудь помочь мне в том, как его оптимизировать.
Update1
Код согласно @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 Я ценю вашу помощь, в настоящее время iam в неотложной медицинской помощи. Я вернусь к этому, как только смогу. – Learner
Некоторые мысли о ваших обновлениях: использование 'isVowel()' является четким улучшением, так как ваш код теперь легче читать. Вы можете проверить, есть ли «лучше» использовать Character.toLowerCase(), например; который сокращает количество сравнений наполовину. Или, как сказано, создайте 'Set vowels = new HashSet <> (Arrays.asList ('A,' a ', ...))' и используйте его метод contains(). Я должен признать, что я не получаю полный объем вашего решения стека (я не уверен, что вам это нужно - так что вы могли бы задуматься о том, чтобы сделать это еще короче ;-) ... наконец: имейте в виду, что это не наставник оказание услуг; поэтому: когда у вас есть еще –
GhostCat
вопросов, то, пожалуйста, задайте новый вопрос (или мы говорим о том, что я даю рекомендации для преподавателя для upvotes else-where ;-) – GhostCat