关键:准确理解子串的定义。
- 子串 (Substring)
子串是原字符串中的一个连续部分。换句话说,子串必须由原字符串中连续的字符组成。
示例:
- 原字符串: “abcdef”
-
子串: “abc”, “cde”, “def”, “a”, “bcd”
-
子序列
子序列是可以通过删除原字符串中的一些字符(或不删除任何字符)而形成的一个新字符串。子序列中的字符不需要连续,但它们在原字符串中的相对顺序不能改变。
示例:
- 原字符串: “abcdef”
- 子序列: “ace”, “bd”, “af”, “abcdef”, “a”, “f”
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int N = 505;
int n, m;
string s = "kfdhtshmrw4nxg#f44ehlbn33ccto#mwfn2waebry#3qd1ubwyhcyuavuajb#vyecsycuzsmwp31ipzah#catatja3kaqbcss2th";
// 判断是否满足条件(至少含有一个数字和字符)
bool check(string s)
{
bool sz = false, fh = false;
for (int i = 0; i < s.size(); i++) {
if (s[i] >= '0' && s[i] <= '9') sz = true; // isdigit(s[i])
else if (s[i] >= 'a' && s[i] <= 'z') continue;
else fh = true; // !isalnum(s[i])
if (sz && fh) return true;
}
return false;
}
void solve()
{
int cnt = 0;
n = s.size();
for (int i = 0; i <= n - 8; i++) {
for (int j = 8; j <= 16 && n - i + 1 >= j; j++) {
string tmp = s.substr(i, j);
if (check(tmp)) cnt++;
}
}
cout << cnt << endl;
}
int main()
{
solve();
return 0;
}