Java:需要查看输入字符串中的每个字符是否匹配“字母”中的任何字符

时间:2019-05-29 01:36:00

标签: java string compare

我正在实施DFA。给定的字母为{a,b}。

我告诉我输入字符串是否被接受。 (它有一个简单的“接受”规则-输入字符串的第一个和最后一个字符必须相同)

但是,我要检查的是检查输入字符串中的每个字符是否符合规定的“字母”。

因此,作为布尔值,如果输入字符串是“ abcdefg”(例如),它将返回false;如果输入字符串是“ abbaabbbbba”(例如),它将返回true。

我需要检查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 个答案:

答案 0 :(得分:1)

我在这里假设,如果字母表包含inputString和inputString的第一个和最后一个字符相同的所有字符,那么它是有效的。

例如,字母= {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;
}

答案 1 :(得分:0)

这只是一个进行模式的架构,更像是一般模式, 在这种情况下适合您的目的。
(仅当第一个字符与最后一个字符相同时接受)

这是您遇到问题的DFA。

enter image description here

基本上有内部状态(圆圈)和过渡状态(箭头)

状态:
S1->开始状态(总是从这里开始)
S2,S3->中介(输入完成后不接受此状态)
S4,S5->最终状态(输入完成,然后接受此状态)`


转场[运动数组]
(StateA,StateB,字符):从SA到SB(带字符)
(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:abb
(S1,a)-> S3由T1
(S3,b)-> T3的S3
(S3,b)-> T3的S3
在S3上结束并且不接受输入

2:babb
(S1,b)-> S2,由T2 T6的
(S2,a)-> S2
(S2,b)-> S5,用T9表示(如果输入完成,则可以接受:bab,这里不是)
(S5,b)-> T5的S5
在S5上结束并接受输入

对于任何其他非字母字符遇到的字符,请立即返回并且不接受。

对于编码,需要添加状态和转换。 然后每个步骤都会正确更新当前状态。

希望对您有用。