有效子字符串算法的数量

时间:2017-07-05 07:01:59

标签: c string algorithm substring

我遇到了一个我无法找到算法的问题。你能帮助我吗? 问题 - 有效的子字符串是包含字母az的子字符串。您将获得一个字符串,您必须计算该字符串的有效子字符串的数量。例如,字符串' abcd'包含4个有效的子串。字符串' azazaz'包含21个有效的子字符串,类似地' abbzbba'包含22个有效的子串。 我只是想知道算法。

1 个答案:

答案 0 :(得分:3)

定义D[i] - 以索引i结尾的有效子字符串数。

假设您拥有此D[i],解决方案只是D[0]+D[1]+...+D[n-1]

通过迭代字符串和每个字符来计算D非常简单:

  • 如果它是"有效",所有以此字符结尾的子字符串都有效。
  • 否则,仅通过扩展以最后一个字符结尾的有效子字符串 - 使其有效。

C代码:

int NumValidSubstrings(char* s) {
  int n = strlen(s);
  int D[n] = {0};  // VLA, if that's an issue, just use dynamic allocation
  for (int i = 0; i < n; i++) { 
    if (s[i] == 'z' || s[i] == 'a') {
      // if character is valid, each substring ending with it is also valid.
      D[i] += i + 1;
    } else if (i > 0) {
      // Else, only valid substrings from last character, that are extended by 1
      D[i] = D[i-1];
    }
  }
  int count = 0;
  for (int i = 0; i < n; i++) count += D[i];
  return count;
}

注意:

  1. 此技术称为Dynamic Programming
  2. 此解决方案为O(n)时间+空格。
  3. 您可以通过不存储整个D数组来节省一些空间 - 但只保存最后一个值并动态计算count,从而使此解决方案O(1)空间和{{1}时间。