3

我正在尝试编写一个函数,该函数接受一个字符串 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);
        }
    }
}

我认为我的想法是正确的。但我不知道如何把它放在一起。

4

7 回答 7

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 的回答中有所概述)

于 2013-08-07T19:22:42.137 回答
4

这听起来像是家庭作业,所以可能你有责任制定细节,但无论如何,我脑海中不断出现一些建议。

例如,您可以尝试:

  1. 删除临时字符串中所有出现的“ba”。
  2. 如果临时字符串中没有其他字母“b”,则返回true
  3. 否则返回false

提示:您可以使用第 1 步和第 2 步中的replace方法indexOf。(单击教程/说明的链接您应该可以在两行或三行代码中执行此操作,具体取决于您是否使用三元运算符作为返回值.)

于 2013-08-07T19:20:12.963 回答
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));
于 2013-08-07T19:20:47.187 回答
1

假设您仅限于在标题中添加的功能,并且您想检查每个 b 是否后跟 a(而不是相反):您已经完成了一半,但您的逻辑有点倒退。当您遍历字符串时:

(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 表示您看到的最后一个字符是 b,因此每次看到不是 b 的内容时,请确保将其设置回 false。

(4) 当字符串的最后一个字符是 b 时,确保你做对了。您必须返回 false,因为后面没有“a”。

于 2013-08-07T19:26:13.750 回答
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;
}
于 2013-08-07T19:24:36.457 回答
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;
}
于 2013-08-07T19:19:08.377 回答
0

查看您的标题,我不清楚您的意思是否必须使用 s.equals、.charAt 和 .substring。但是,如果没有,您可以为此使用正则表达式.*b[^a].*|.*b$(谢谢ajb),如果它匹配b后跟任何字符但是(或字符串末尾的a特殊情况),则函数失败,例如:b

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 + "$"));

}

请注意,如果字符串根本不包含,这将返回 true a。如果您希望它在这种情况下返回 false,则必须先检查:

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 + "$"));

}

我们使用 Pattern.quote 的原因是允许它处理正则表达式中具有特殊含义的字符,例如']'。

如果你不能使用正则表达式,状态机风格的方法会给你很好的结果:

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);

}

由于只有两种状态,您可以只使用布尔值。

于 2013-08-07T19:26:20.740 回答