本文共 1797 字,大约阅读时间需要 5 分钟。
思路:
一个线程输出一个“croak”,可以连续输出,但只能算作一个线程。共同的目标:在字符串中实时跟踪青蛙的状态变化,计算最多有多少个线程同时被占用。数组结构:
使用二维数组dp[MAXN][5],用于记录处于字符串位置i,处于 状态c r o a k的线程数量。状态转换规则:
'c',表示新线程启动,状态置为0,并自增当前状态。'c',则状态转移自增当前状态并自减前一个状态。更新策略:
// 以下是完整代码实现const int MAXN = 1e5 + 50;int dp[MAXN][5];int c2i(char x) { if (x == 'c') return 0; if (x == 'r') return 1; if (x == 'o') return 2; if (x == 'a') return 3; if (x == 'k') return 4; return -1;}class Solution { public: int minNumberOfFrogs(string str) { if (str.empty()) return 0; int n = str.size(); int ans = 0; if (n == 0) return 0; for (int i = 1; i <= n; ++i) { char c = str[i - 1]; int cur = c2i(c); if (cur == -1) return -1; if (cur == 0) { dp[i][0]++; } else { dp[i][cur]++; dp[i][cur - 1]--; } for (int k = 0; k < 4; ++k) { dp[i][k] += dp[i - 1][k]; } for (int k = 0; k < 5; ++k) { if (dp[i][k] < 0) return -1; } int sum = 0; for (int k = 0; k < 5; ++k) { sum += dp[i][k]; if (sum > ans) ans = sum; } } for (int k = 0; k < 4; ++k) { if (dp[n][k] != 0) { return -1; } } return ans; }}; 转载地址:http://lghpz.baihongyu.com/