我正在尝试编写一个带字符串s的函数,如果字符b的每次出现总是由字符a继承,则返回true,否则返回false。 我试过了:
boolean succeeds(char a, char b, String s) {
boolean to_return = true;
boolean seen_a = false;
while(true) {
if (s.equals("")) return to_return;
char c2 = s.charAt(0);
if (c2 == a) seen_a = true;
if (c2 == b) {
if (!seen_a) return false;
}
s = s.substring(1);
}
}
}
我认为我有正确的想法。但我不知道怎么把它放在一起。
答案 0 :(得分:7)
根据指南,你可以按照
的方式做点什么while (!s.equals("")) {
char c = s.charAt(0); // record first char
s = s.substring(1); // cut off first char
// if "first char is 'b' and next is
// not 'a'", we can return false
if (c == b && (s.equals("") || s.charAt(0) != a))
return false;
}
return true;
顺便说一句,这可以更轻松地完成:
return s.replace(""+b+a, "").indexOf(b) < 0;
(我刚注意到这种方法最初在@JosephMyers' answer)
中列出答案 1 :(得分:4)
这听起来像是家庭作业,所以你可能有责任弄清楚细节,但无论如何,我想到了一些建议。
例如,您可以尝试:
true
。false
。提示:您可以在步骤1中使用replace
method,在步骤2中使用indexOf
。(单击教程/说明的链接您应该能够在两行或三行代码中执行此操作,取决于您是否使用三元运算符作为返回值。)
答案 2 :(得分:2)
不一定非常复杂。例如:
for (i = 0; i < s.length - 1; i++) {
if (s.charAt(i - 1) == b && s.charAt(i) != a) {
return false;
}
}
return !s.endsWith(String.valueOf(b));
答案 3 :(得分:1)
假设你只限于你在标题中输入的功能,并且你想检查每个b后面是否有一个(而不是相反):你已经到了一半,但你的逻辑是一个有点倒退。当你浏览字符串时:
(1)当你看到“b”时,你需要记住这个事实。所以你可能想要一个变量seen_b而不是seen_a。
(2)在下一个角色上,如果你还记得你刚刚看到“b”,那么你需要确保下一个角色是“a”。而不是
if (c2 == b) {
if (!seen_a) return false;
}
你可能应该有像
这样的东西if (seen_b) {
if (c2 != a) return false;
}
或更简洁
if (seen_b && c2 != a) return false;
(3)因为seen_b == true表示你看到的 last 字符是b,所以每次看到不是b的东西时,请确保将其设置为false。
(4)确保在字符串的最后一个字符为b时正确执行操作。你必须返回false,因为后面没有“a”。
答案 4 :(得分:0)
这样的事情应该有效。我没有编译这个。希望它能帮助您找到正确的方向,即使可能存在语法错误。
public boolean succeeds(char a, char b, String s){
boolean sawFirst= false;
for(int i=0;i<s.length();i++){
if(!sawA){
if(s.charAt(i)==b)
sawFirst = true;
}
else{
if(s.charAt(i)!=a)
return false;
else sawFirst= false;
}
}
return true;
}
答案 5 :(得分:0)
使用s.equals(“”),s.charAt(0),s.substring(1)?
怎么样:
public static boolean succeeds(final char a, final char b, String s)
{
if(s==null||s.equals(""))
return true;
char previousFirstChar,newFirstChar;
previousFirstChar=s.charAt(0);
while(true)
{
s=s.substring(1);
if(s.equals(""))
{
if(previousFirstChar==b)
return false;
break;
}
newFirstChar=s.charAt(0);
if(previousFirstChar==b && newFirstChar!=a))
return false;
previousFirstChar=newFirstChar;
}
return true;
}
答案 6 :(得分:0)
看看你的标题,我不清楚你是否意味着 使用s.equals,.charAt和.substring。但是,如果没有,您可以使用正则表达式.*b[^a].*|.*b$
(谢谢 ajb ),如果函数匹配b
后跟任何字符,a
,b
1}}(或字符串末尾的特殊情况import java.util.regex.Pattern;
...
public boolean succeeds (char a, char b, String s) {
String quoteda = Pattern.quote(Character.toString(a));
String quotedb = Pattern.quote(Character.toString(b));
return !(s.matches(".*" + quotedb + "[^" + quoteda + "].*|.*" + quotedb + "$"));
}
),例如:
a
请注意,如果字符串根本不包含public boolean succeeds (char a, char b, String s) {
if (s.indexOf(b) == -1)
return false;
String quoteda = Pattern.quote(Character.toString(a));
String quotedb = Pattern.quote(Character.toString(b));
return !(s.matches(".*" + quotedb + "[^" + quoteda + "].*|.*" + quotedb + "$"));
}
,则返回true。如果你希望它在这种情况下返回false,你必须先检查:
public boolean succeeds (char a, char b, String s) {
int state = 0;
for (int n = 0; n < s.length(); ++ n) {
if (state == 0) {
if (s.charAt(n) == b)
state = 1;
} else if (state == 1) {
if (s.charAt(n) == a)
state = 0;
else
return false;
}
}
return (state == 0);
}
我们使用Pattern.quote的原因是允许它处理正则表达式中具有特殊含义的字符,例如']'。
如果你不能使用正则表达式,那么状态机方式方法会给你带来好结果:
{{1}}
由于只有两个状态,你可以使用布尔值。