【问题标题】:Given a String 'a' - Check for occurrences of String 'b' in 'a' and replace those occurrences with String 'c'给定一个字符串 'a' - 检查字符串 'b' 在 'a' 中的出现并用字符串 'c' 替换这些出现
【发布时间】:2013-12-18 05:57:29
【问题描述】:

我有工作代码可以检查“a”中字符串“b”的模式,并用字符串“c”替换那些模式。它利用 String.split() 并多次扫描 String 'a',找到索引来进行替换,并使用 StringBuilder 来避免多余地复制 String 'a'。所以它在线性时间 O(n) 中运行。

现在,问题是如果有重叠的模式匹配,我仍然会得到一个肯定的匹配。例如,在字符串 a = 'ababa' 的情况下 --> 我得到两个字符串 b = 'aba' 的匹配项。如何通过仅替换第一个完整匹配项而不将剩余字符“ba”标识为匹配项来解决此问题。如果 String c = 'c',我期望 a = 'cba' 的结果。

这是我的代码。

public static String replaceSubstringWithPattern () {
    String a = "abab";
    String b = "aba";
    String c = "c";

    //Special Cases --> if a or b are empty no need to substitute
    if (a.isEmpty() || b.isEmpty()) return a;

    StringBuilder aTemp = new StringBuilder();
    String[] aArray = a.split(b);  // <-- 
    System.out.println("aArray = " + aArray.length);

    //Special Cases --> no splits because string a is exclusive repetition of string b
    if (aArray.length == 0) {
        for (int x = 0; x < a.length()/b.length(); x++) {
            aTemp.append(c);
        }
        return aTemp.toString();
    }

    aTemp.append(aArray[0]);    //firstElement

    for (int i=1; i<aArray.length; i++) {
        aTemp.append(c);
        aTemp.append(aArray[i]);
    }

    return aTemp.toString();
}

【问题讨论】:

  • 你不能只做a.replaceFirst(b, c);吗?
  • result = a.replace(b, c);?
  • 如果这是家庭作业,请注意,以便我们在不直接回答的情况下给予更好的指导,否则给出的答案是完美的。

标签: java regex string split


【解决方案1】:

你可以试试这个:

String a="ababa";
String b="aba";
String c="c";

System.out.println("result= " + a.replaceFirst(b,c));

输出

result= cba

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2015-12-18
    • 1970-01-01
    相关资源
    最近更新 更多