给定一个字符串和一个非空子字符串,递归计算最大的子字符串,该子字符串以子字符串开头和结尾并返回其长度

时间:2018-04-18 06:18:59

标签: java algorithm

给定一个字符串和一个非空的子字符串,递归计算最大的子字符串,它以子字符串开头和结尾并返回其长度。

我所做的并没有返回正确的长度。但因为我保存了所有可能的子串,我可以确定长度。时间复杂度应该是线性的:O(n)。

这就是我的尝试:

public class StringPatternMatcher {

  static String[] array = new String[10];
  static int n = 0;

  public static int findSubString ( String s, String pat) {
    if ( s.length() < pat.length() ) {
        return 0;
    }
    else {
        return s.indexOf(pat);
    }
  }

  public static int findMaxSubstring ( String s, String pat) {
    if ( s.length() < pat.length() ) {
        return 0;
    }
    else if ( s.startsWith(pat, 0)){
        int idx = findSubString( s.substring(pat.length()), pat );
        if ( idx == -1 || idx == 0 ) {
            return -1;
        }
        array[n++] = s.substring(pat.length(), pat.length() + idx);
        return findMaxSubstring( s.substring(pat.length()), pat);
    }
    else {
        return 1 + findMaxSubstring( s.substring(1), pat);
    }       
  }

  public static void main(String[] args) {
    String s = "catwomencatwhiskerscat";
    System.out.println("Count is : " + findMaxSubstring( s, "cat"));
    for ( String str : array) {
        if (str != null )
            System.out.println("The string is:" + str + " and it's len is: " + str.length());
    }
  }
}

1 个答案:

答案 0 :(得分:2)

如果您想要线性复杂性,则不能使用循环。在这种情况下,您可以遵循的算法;

1-查找第一次出现
2-查找最后一次出现(通过反转字符串和模式,然后执行相同的步骤1)
3-查找最后一次出现的实际索引(通过从实际字符串的长度中减去步骤2的结果)
4-检查结果是否有效(如果结果(步骤3) - 结果(步骤1)> 0,则其有效)