lintcode之最长公共前缀
2016-04-16 20:30
399 查看
题目:
给k个字符串,求出他们的最长公共前缀(LCP)
解答:
这道题做法应该很多,可以用trie树,也可以直接枚举
我是用二分+测试做的,找到最短的那个字符串,二分枚举长度,然后测试
class Solution {
public:
/**
* @param strs: A list of strings
* @return: The longest common prefix
*/
string longestCommonPrefix(vector<string> &strs) {
// write your code here
string min = "";
int minLen = ~(1 << 31);
int size = strs.size();
if (size == 0) {
return "";
}
for (int i = 0; i < size; ++i) {
if (strs[i].length() < minLen) {
minLen = strs[i].length();
min = strs[i];
}
}
int l = 0;
int r = minLen;
while(l < r) {
int mid = l + (r - 1) / 2;
string temp = min.substr(0, mid);
if (isPrefix(temp, strs)) {
if (!isPrefix(temp + min[mid], strs))
return temp;
else
l = mid + 1;
}
else {
r = mid - 1;
}
}
return min.substr(0, l);
}
bool isPrefix(string str, vector<string> &strs) {
for (int i = 0; i < strs.size(); ++i) {
for (int j = 0; j < str.length(); ++j) {
if (strs[i][j] != str[j]) {
return false;
}
}
}
return true;
}
};
给k个字符串,求出他们的最长公共前缀(LCP)
解答:
这道题做法应该很多,可以用trie树,也可以直接枚举
我是用二分+测试做的,找到最短的那个字符串,二分枚举长度,然后测试
class Solution {
public:
/**
* @param strs: A list of strings
* @return: The longest common prefix
*/
string longestCommonPrefix(vector<string> &strs) {
// write your code here
string min = "";
int minLen = ~(1 << 31);
int size = strs.size();
if (size == 0) {
return "";
}
for (int i = 0; i < size; ++i) {
if (strs[i].length() < minLen) {
minLen = strs[i].length();
min = strs[i];
}
}
int l = 0;
int r = minLen;
while(l < r) {
int mid = l + (r - 1) / 2;
string temp = min.substr(0, mid);
if (isPrefix(temp, strs)) {
if (!isPrefix(temp + min[mid], strs))
return temp;
else
l = mid + 1;
}
else {
r = mid - 1;
}
}
return min.substr(0, l);
}
bool isPrefix(string str, vector<string> &strs) {
for (int i = 0; i < strs.size(); ++i) {
for (int j = 0; j < str.length(); ++j) {
if (strs[i][j] != str[j]) {
return false;
}
}
}
return true;
}
};
相关文章推荐
- 只有程序员看的懂的面试圣经|如何拿下编程面试
- 下一次技术面试时要问的 3 个重要问题
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- PHP程序员面试 切忌急功近利(更需要注重以后的发展)
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总