字符串模拟题精选:思维与实现解析
在字符串算法题中,有一类题目看起来没有太多算法技巧,却经常让人'翻车'——那就是字符串模拟题。这类题型往往不依赖复杂的数据结构或高级算法,更多的是对逻辑构造能力、字符串操作细节以及边界处理的考察。
14. 最长公共前缀
题目来源:LeetCode 14. 最长公共前缀
算法思路
解法一:两两比较
通过两两比较的方式,不断循环寻找字符不相等的位置,利用 substr 接口进行字符串截取。这里,'最长公共前缀'的意思是根据木桶效应,取最短字符串的长度作为'最长公共前缀'的上限。
代码实现:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
// 解法一:两两结合
string tmp = strs[0];
for (int i = 1; i < strs.size(); i++) {
tmp = findPrefix(tmp, strs[i]);
}
return tmp;
}
string findPrefix(string& s1, string& s2) {
int i = 0;
while (i < min(s1.size(), s2.size()) && s1[i] == s2[i]) i++;
return s1.substr(0, i);
}
};
解法二:统一比较
使用 char 类型变量记录字符串中的元素,通过循环逐个比较字符是否相等。考虑到'最长公共前缀'的上限,当某段完全相同的字符串长度等于当前遍历的字符串长度时,说明已经达到了公共前缀的上限,此时可以直接返回结果。
代码实现:
class Solution {
public:
{
( j = ; j < strs[].(); j++) {
ch = strs[][j];
( i = ; i < strs.(); i++) {
(j == strs[i].() || strs[i][j] != ch) strs[].(, j);
}
}
strs[];
}
};


