2 回答
TA贡献1936条经验 获得超6个赞
我在这里假设如果字母表包含来自 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;
}
TA贡献1895条经验 获得超7个赞
这只是如何进行的模式,它更像是一种通用模式,在这种情况下会根据您的目的进行调整。
(仅当第一个字符与最后一个字符相同时才接受)
这是您问题的 DFA。
基本上有内部状态(圆圈)和转换(箭头) 状态
:
S1->开始状态(总是从这里开始)
S2,S3->中间(当输入完成并且此状态不被接受时)
S4,S5->最终状态(输入完成,然后接受此状态)`
Transitions[movements array]
(StateA, StateB, char) : 从 SA 到 SB with 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:abb
(S1,a)->S3 by T1
(S3,b)->S3 by T3
(S3,b)->S3 by T3
End on S3 and input is not accepted
2:babb
(S1,b)->S2 by T2
(S2,a)->S2 by T6
(S2,b)->S5 by T9(接受如果输入是finish:bab,这里不是)
(S5,b) ->S5 by T10
在 S5 上结束并接受输入
对于任何其他不在字母表中的字符遇到,立即返回不接受。
对于编码,需要添加状态和转换。在每一步逐个检查输入字符时,然后正确更新当前状态。
希望对你有用。
添加回答
举报