帮助Java中的字符串相等

时间:2010-06-07 09:49:49

标签: java equals

以下函数接受2个字符串,第2个(不是第1个)可能包含*个(星号)。 *是字符串的替换(空,1个字符或更多),它可以出现(仅在s2中)一次,两次,更多或根本不显示,它不能与另一个{{1}相邻}(*),无需检查。

ab**c

如果字符串具有相同的模式,则返回true。 它必须是递归的,不能使用任何循环,静态或全局变量。此外,禁止在String类中使用方法public static boolean samePattern(String s1, String s2) 。可以使用局部变量和方法重载。 只能使用以下方法:equalscharAt(i)substring(i)substring(i, j)

示例:

length()

我现在被困在这个问题上好几个小时了!我需要Java解决方案,请帮助我。

2 个答案:

答案 0 :(得分:5)

看起来你可能想要regular expressions

.+正则表达式模式等同于*

但是你有两个问题。

答案 1 :(得分:2)

以下是Java中问题的递归,无循环解决方案:

static boolean samePattern(String s1, String s2) {
    return
        s2.isEmpty() ?
            s1.isEmpty()
            :
        s2.charAt(0) == '*' ?
            samePattern(s1, s2.substring(1))
            || (!s1.isEmpty() && samePattern(s1.substring(1), s2))
            :
        !s1.isEmpty() && s2.charAt(0) == s1.charAt(0) ?
            samePattern(s1.substring(1), s2.substring(1))
            :
        false;
}
public static void main(String[] args) {
    String[] patterns = {
        "The*xamIs*y",    // true
        "Th*mIsEasy*",    // true
        "*",              // true
        "TheExamIsEasy",  // true
        "The*IsHard",     // false
    };
    for (String pattern : patterns) {
        System.out.println(samePattern("TheExamIsEasy", pattern));
    }
}

算法

基本上这里是递归定义:

  • 如果s2为空,那么如果samePattern也为空则为s1
  • 否则s2不为空
    • 如果它以*开头,那么它是samePattern if
      • samePattern移除了*
      • 或者是samePattern,其字符已从s1中删除(如果有的话)
    • 否则以常规字符开头
      • 如果匹配第一个字符s1,请检查其余samePattern是否为s1, s2
      • 否则它不是samePattern,所以它是false

简化版

以下是上述算法的简化版本:

static boolean samePatternSimplified(String s1, String s2) {
    if (s2.length() == 0) {
        return s1.length() == 0;
    } else if (s2.charAt(0) == '*') {
        return samePatternSimplified(s1, s2.substring(1))
           || (s1.length() != 0 && samePatternSimplified(s1.substring(1), s2));
    } else if (s1.length() != 0 && s2.charAt(0) == s1.charAt(0)) {
        return samePatternSimplified(s1.substring(1), s2.substring(1));
    } else {
        return false;
    }
}

API链接