Найдите количество подстрок строки, удовлетворяющих критерию

#java #string #algorithm #testing #substring

Вопрос:

Вопрос: Учитывая строку a, найдите количество подсегментов строки, содержащих по крайней мере одну гласную И одну согласную. Например : ввод «синий» будет иметь количество подстрок = 1, «хакерранк» вернет количество сегментов = 3 («ха»,»cker»,»ранг»), каждый из которых будет содержать по крайней мере одну согласную и одну гласную.

Вот мой код на Java

 public static int segments(String password){
      int numbersegments = 0;
      int vowel = 0;
      int consonant = 0;
      for(int index = 0; index < password.length();index  ){
            if(password.charAt(index) == 'a' || password.charAt(index) == 'e' ||
                    password.charAt(index) == 'i' || password.charAt(index) == 'u'
                    || password.charAt(index) == 'o'    ){
                  vowel  ;
            }
            else
                consonant  ;
            if(vowel >= 1 amp;amp; consonant >= 1){
                numbersegments  ;
                vowel = 0;
                consonant = 0;

            }
      }
      return numbersegments;
}
 

Я запускаю тестовые примеры с приведенным выше кодом, и он показывает, что 5 из 15 выходов являются правильными. К сожалению, я не вижу входных данных для этих неправильных тестов, поэтому я никак не могу увидеть недостающую логику для моего кода выше, чтобы он выполнялся на 100% правильно во всех случаях. Может быть, я не принял во внимание некоторые крайние случаи, но я не могу придумать ни одного. Есть ли какой-либо изъян в моем коде выше ? Есть ли какие-либо пропущенные случаи, которые я забываю принять во внимание ? Спасибо

Комментарии:

1. @kungho вы не приняли во внимание заглавные буквы, специальные символы и цифры. вы проверяете только гласные со строчными буквами. так что «синий», например, не работает

Ответ №1:

Попробуйте это, я думаю, это сработает

 public static int segments(String password){
  int numbersegments = 0;
  int vowel = 0;
  int consonant = 0;

  password = password.toLowerCase(); 

  for(int index = 0; index < password.length();index  ){
        if(password.charAt(index) == 'a' || password.charAt(index) == 'e' ||
                password.charAt(index) == 'i' || password.charAt(index) == 'u'
                || password.charAt(index) == 'o'  ){
              vowel  ;
        }
        else if(password.charAt(index)>='a' amp;amp; password.charAt(index)<='z')
            consonant  ;

        if(vowel >= 1 amp;amp; consonant >= 1){
            numbersegments  ;
            vowel = 0;
            consonant = 0;
        }
  }
  return numbersegments;
}
 

Вы не приняли во внимание заглавные буквы, специальные символы и цифры. вы проверяете только гласные со строчными буквами.

Комментарии:

1. Да, я должен был принять во внимание заглавную букву, но как учет специальных символов и цифр изменит логику моего кода, поскольку мой цикл for не исключал ни одного из них, когда я проверял условие

2. «a1» не соответствует вашим условиям, но он вернет 1 из вашей функции.