单词拆分 要求我们判断一个字符串是否可以被空格拆分成一个或多个在字典中出现的单词。这是一个典型的动态规划问题。
我们可以使用一个数组 dp 来记录从字符串开始到当前位置是否可以被拆分成一个或多个字典中的单词。dp[i] 表示字符串的前 i 个字符是否可以被拆分成字典中的单词。
dp,长度为 n+1,其中 n 是字符串的长度。dp[i] 表示字符串的前 i 个字符是否可以被拆分成字典中的单词。dp[0] 为 true,因为空字符串总是可以被拆分的。i:0 到 i 的所有位置 j:dp[j] 为 true(意味着前 j 个字符可以被拆分),并且从 j+1 到 i 的子字符串存在于字典中,那么设置 dp[i] = true。
4.最后,返回 dp[n],即整个字符串是否可以被拆分成字典中的单词。
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
Set<String> wordSet = new HashSet<>(wordDict); // 将字典转换为HashSet以便快速查找
int n = s.length();
boolean[] dp = new boolean[n + 1]; // dp数组,长度为n+1,初始化为false
dp[0] = true; // 空字符串总是可以被拆分的
for (int i = 1; i <= n; i++) { // 从1开始,因为已经初始化了dp[0]
for (int j = 0; j < i; j++) { // 尝试所有可能的拆分点
if (dp[j] && wordSet.contains(s.substring(j, i))) { // 如果前缀可以拆分,并且当前子串在字典中
dp[i] = true; // 则当前位置也可以被拆分
break; // 找到一个有效的拆分方式,可以提前结束内层循环
}
}
}
return dp[n]; // 返回整个字符串是否可以被拆分
}
}由于只有CPU饱和,可以判断:
这说明:
可采用以下步骤(可以在面试时按这个顺序答):
1. top/htop/ps 查看哪个进程/线程占用 CPU 高
如果是 Java 程序,可以记录线程ID,转换为十六进制再到 jstack 中排查。
2. jstack / perf / flame graph 分析具体代码
对于 Java 应用:
3. 查看接口调用日志 / 链路追踪
4. 结合压测场景回看流量特征
常见导致 CPU 100% 的场景
1. 死循环或递归未终止
2. 代码中有大量 JSON/XML 解析、数据加密解密等 CPU 密集操作
3. 热 Key 问题 / 锁竞争严重
4. 无效请求/错误参数导致计算逻辑异常
5. 线程池配置错误,过多线程切换(上下文切换高)
6. 日志打印过多,尤其在控制台打印
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。