Java: нужно посмотреть, соответствует ли каждый символ во входной строке любому символу в «алфавите» - PullRequest
1 голос
/ 29 мая 2019

Я реализую DFA.Данный алфавит: {a, b}.

Я получил сообщение о том, принята ли входная строка или нет.(у него есть простое правило «принять» - первый и последний символ входной строки должен быть одинаковым)

Однако я пытаюсь проверить, есть ли каждый символ во входной строке, допускается в соответствии с предписанным «алфавитом».

Таким образом, в качестве логического значения он возвращает false, если входная строка имеет значение «abcdefg» (например) ..., и возвращает true, если входная строкаэто «abbaabbbbba» (например)

Мне нужно проверить, есть ли буква a в алфавите ... тогда, если b в алфавите ... тогда если c в алфавите ... и так далеедля каждого символа во входной строке.

Я пробовал варианты циклов разных видов (я не помню каждый вариант!), сравнивая inputString.charAt (i) с каждым символом в алфавите.... но пока ничего не работает так, как мне нужно / хочется.

например, сейчас я пытаюсь:

  public boolean isInAlphabet(String inputString) {
    if(inputString == " ") {
      System.out.println("   -> empty string is not in our alphabet");
      return false;
    }

    for(int i = 0; i < inputString.length(); i++) {
      Character check = inputString.charAt(i);
      System.out.print(check);  // just to see what it's doing

      if(check.equals(alphabet.charAt(0)) || check.equals(alphabet.charAt(1))) {
        System.out.println("   -> your input string is in our alphabet");

        return true;
      }
      else{
        System.out.println("   -> your input string is *not* in our alphapet");
        return false;
      }
    }
    return false;
  }

алфавит представлен в виде:

String alphabet = "ab";

и входная строка имеет вид:

String inputString = "abcdefg";

Дело в том, чтопрекращает проверку после того, как обнаруживает, что первый символ во входной строке находится в алфавите.

Как:

test input string: abcdefg
is test input string in our alphabet?
a   -> your input string is in our alphabet

... и это все дальнейшая проверка, которую он делает.

Как мне получить, чтобы проверить всю входную строку - каждый символвходной строки, против алфавита?

Как я уже сказал, я даже не могу вспомнить все, что я пробовал до сих пор, но это было по крайней мере дюжина.Чем больше я стараюсь, тем больше путаюсь.Это так просто, но я не уверен, как заставить это работать.

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Здесь я предполагаю, что если алфавит содержит все символы из inputString и первого и последнего символа inputString, то это верно.

Но, например, Alphabet = {a, b} и inputString = "aaaaa".Итак, я предполагаю, что этот вклад также будет действительным.(Если это то, что вы ищете, то вы можете использовать следующую логику для ее решения.) Я беру HashSet для алфавита, а затем мы можем перебрать всю строку и проверить, содержит ли ее алфавит или нет.Приведенный ниже код используется для преобразования строки алфавита в HashSet.

    String str="ab";
    for(char ch:str.toCharArray()){
        alphabet.add(ch);
    }

Теперь, чтобы реализовать метод проверки правильности ввода, вы можете рассмотреть приведенный ниже код.

public boolean isInAlphabet(String inputString) {
    if(inputString==null || inputString.length()==0) return false;
    if(inputString.charAt(0)!=inputString.charAt(inputString.length()-1)) return false;
    for(char ch:inputString.toCharArray()){
        if(!alphabet.contains(ch)) return false;
    }
    return true;
}
0 голосов
/ 29 мая 2019

Это всего лишь схема того, как действовать, и это больше похоже на общую схему, в этом случае адаптирован для ваших целей.
(принимайте, только если первый символ совпадает с последним)

Это DFA для вашей проблемы.

enter image description here

В основном есть состояния внутри (круги) и переходы (стрелки)

государства:
S1-> начальное состояние (всегда начинайте отсюда)
S2, S3 -> посредник (когда ввод завершен, и это состояние тогда не принимается)
S4, S5 -> конечное состояние (завершение ввода и это состояние затем принимается) `


Переходы [массив движений]
(StateA, StateB, char): переход от SA к SB с char
(S1, S3, a): T1
(S1, S2, b): T2
(S3, S3, b): T3
(S3, S4, a): T4
(S4, S4, a): T5
(S2, S2, a): T6
(S4, S3, b): T7
(S2, S5, b): T8
(S5, S2, a): T9
(S5, S5, b): T10

Например:
1: АВВ
(S1, a) -> S3 от T1
(S3, b) -> S3 от T3
(S3, b) -> S3 от T3
Конец на S3 и ввод не принят

2: Бабб
(S1, b) -> S2 от T2
(S2, a) -> S2 от T6
(S2, b) -> S5 от T9 (принимается, если ввод закончен: bab, здесь нет)
(S5, b) -> S5 от T10
Конец на S5 и ввод принят

Для любого другого столкновения с символами, которое не в алфавите, просто немедленно вернитесь с не принятым.

Для кодирования нужно добавить состояния и переходы. При проверке входного char по char на затем каждый шаг корректно обновляйте текущее состояние.

Надеюсь быть полезным для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...