【问题标题】:Java: need to see if each char in input string, matches any char in "alphabet"Java:需要查看输入字符串中的每个字符是否与“字母”中的任何字符匹配
【发布时间】:2019-05-29 01:35:59
【问题描述】:

我正在实施 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

...这就是它所做的所有进一步检查。

如何让它检查整个输入字符串——输入字符串的每个字符,对照字母表?

就像我说的,我什至不记得到目前为止我尝试过的所有事情,但至少有十几个。我越尝试越困惑。这感觉很简单,但我不知道如何让它发挥作用。

【问题讨论】:

  • System.out.println(" -&gt; your input string is in our alphabet");return true; 移出for 循环并用它替换最后一个return false。因为你只想return true;在你检查了每一个字母并且每一个都通过之后。
  • 好吧,废话...我知道这很容易。谢谢 - 这是有效的!我现在觉得自己像个白痴。我应该在两个小时前问...哈哈!
  • if(inputString == " ") 不是你在 java 中比较字符串的方式
  • 另外,考虑使用:alphabet.indexOf(check)。这将允许您使用任何长度的字母表。
  • 如果字母不在字符串中,它将返回-1。所以if (alphabet.indexOf(check) == -1) { // Not in string....}

标签: java string compare


【解决方案1】:

我在这里假设如果字母表包含 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;
}

【讨论】:

    【解决方案2】:

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

    这是针对您的问题的 DFA。

    基本上里面有状态(圆圈)和转换(箭头)

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


    过渡[运动数组]
    (StateA, StateB, char) : 使用 char 从 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)->S3 by T3
    (S3,b)->S3 by T3
    在 S3 上结束并且不接受输入

    2:巴布
    (S1,b)->S2 由 T2
    (S2,a)->S2 由 T6
    (S2,b)->S5 by T9
    (S5,b)->S5 by T10
    在 S5 上结束并接受输入

    对于任何其他不在字母表中的字符,只要不接受就立即返回。

    对于编码,需要添加状态和转换。当通过char检查输入char时 然后每一步都会正确更新当前状态。

    希望对你有用。

    【讨论】:

      猜你喜欢
      • 2012-04-08
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 1970-01-01
      • 2017-11-13
      • 2017-10-18
      • 2022-06-10
      • 2011-04-03
      相关资源
      最近更新 更多