我遇到了一个我无法找到算法的问题。你能帮助我吗?
问题 - 有效的子字符串是包含字母a
或z
的子字符串。您将获得一个字符串,您必须计算该字符串的有效子字符串的数量。例如,字符串' abcd
'包含4个有效的子串。字符串' azazaz
'包含21个有效的子字符串,类似地' abbzbba
'包含22个有效的子串。
我只是想知道算法。
答案 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;
}
注意:
O(n)
时间+空格。D
数组来节省一些空间 - 但只保存最后一个值并动态计算count
,从而使此解决方案O(1)
空间和{{1}时间。