簡體   English   中英

幫助Java中的字符串相等

[英]Help with string equality in Java

以下函數接受2個字符串,第二個(非第一個)可能包含*的(星號)。 *代替字符串(空,1個字符或更多),它可以出現一次(僅在s2中)一次,兩次,更多或根本沒有出現,它不能與另一個*ab**c )相鄰,無需檢查。

public static boolean samePattern(String s1, String s2)

如果字符串具有相同的模式,則返回true。 它必須是遞歸的,不能使用任何循環,靜態或全局變量。 另外, 禁止在String類中使用equals方法。 可以使用局部變量和方法重載。 只能使用以下方法: charAt(i)substring(i)substring(i, j)length()

例子:

1: TheExamIsEasy; 2: "The*xamIs*y" ---> true
1: TheExamIsEasy; 2: "Th*mIsEasy*" ---> true
1: TheExamIsEasy; 2: "*" ---> true
1: TheExamIsEasy; 2: "TheExamIsEasy" ---> true
1: TheExamIsEasy; 2: "The*IsHard" ---> FALSE

我在這個問題上困擾了很多小時! 我需要Java解決方案,請幫助我。

看起來您可能需要正則表達式

.+ regex模式與*等效。

但是然后您將遇到兩個問題。

以下是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
      • 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鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM