自己写的:
题目要求时间复杂度是o(n*len),说明可以遍历所有的字符。
空间复杂度o(1),说明不能用字符串存储公共前缀,所以用下标来记录。
调试过程:
大概花了20min。
我调试前的做法是,在while循环中,从后往前遍历,用的j--。但是没有考虑到第0个字符串长度很小的问题。所以改成了j++。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param strs string字符串vector
* @return string字符串
*/
string longestCommonPrefix(vector<string>& strs) {
// write code here
int ans = 100000; //粗心,错误示范:ans = 0
int n = strs.size();
cout<<"n"<<n<<endl;
if(n == 0)
return "";
if(n == 1)
return strs[0];
for(int i = 1; i < n; i++){
int j = 0;
while(j < strs[0].size() && j < strs[i].size() && strs[0][j] == strs[i][j]) // 第0个字符串长度可能很小
j++;
// j为相同字符串的位置的后一个,或者为两个字符串中,短的字符串的长度
ans = min(ans, j);
}
return strs[0].substr(0, ans); //粗心,左闭右开!
}
};
模板的:
我采用的是,第一个字符串和后面每个字符串,二者逐次比较,即二者逐个字符进行比较。
模板的是,针对每个字符,从前往后,比较所有的字符串是否相同。
时间复杂度都是o(n*len)。