Problem 14. Longest Common Prefix
-
题目描述
Write a function to find the longest common prefix string amongst an array of strings.
If there is no common prefix, return an empty string “”. -
解题思路
本题采用的是迭代的办法,令输入的字符串组为strs,其首元素为first = strs[0],则假设first就是这个字符串组的最长公共子前缀。
随后从strs[1]开始对strs进行遍历,只要first不是strs[i]的前缀,就将first的最后一个字符移除,直到是strs[i]的前缀才进行下一次遍历。
本题的思想是,先对strs[0]和strs[1]求最长前缀,将得到的结果再对strs[2]求最长前缀,以此类推。因为每次求出来的最长前缀的长度不会增加,所以后续的遍历过程会越来越快。 -
代码实现
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
int len = strs.size();
if (len == 0) return "";
string first = strs[0];
for (int i = 1; i < len; ++i){
while (strs[i].find(first) != 0){
first = first.substr(0, first.length()-1);
if (first == "") return "";
}
}
return first;
}
};
Problem 15. 3Sum
-
题目描述
Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero. -
解题思路
-
代码实现
class Solution {
public:
vector<vector<int> > threeSum(vector<int>& nums) {
vector<vector<int> > res;
int len = nums.size();
int target, sum;
int front, rear;
sort(nums.begin(), nums.end());
for (int i = 0; i < len; ++i){
if (nums[i] > 0) break;
if (i > 0 && nums[i] == nums[i-1]) continue;
target = -nums[i];
front = i+1;
rear = len-1;
while(front < rear){
sum = nums[front] + nums[rear];
if (sum < target) ++front;
else if (sum > target) --rear;
else{
res.push_back({nums[i], nums[front], nums[rear]});
int n1 = nums[front], n2 = nums[rear];
while(front < rear && nums[front] == n1) ++front;
while(front < rear && nums[rear] == n2) -- rear;
}
}
}
return res;
}
};
Problem 17. Letter Combinations of a Phone Number
-
题目描述
Given a string containing digits from 2-9 inclusive, return all possible letter combinations that the number could represent.
A mapping of digit to letters (just like on the telephone buttons) is given below. Note that 1 does not map to any letters. -
解题思路
创建vector< string>变量res,用于储存返回的字符串集。本题采用的是广度优先搜索BFS的方式解决,利用vector< string>代替队列queue。假设输入的字符串为“23”:
- 初始化res为[""],即往res中插入一个空字符串,记录res的元素个数size=1;
- 将res中每个元素都删除(类似于队列的pop操作),由于size=1,所以只需要删除一次。将要删除的字符串记为temp。由于“2”代表的是“abc”,则分别将“a”、“b”、“c”拼接到temp后,将得到的值插入到res后(类似于队列的push操作),此时res为[“a”, “b”, “c”],记录新的res的元素个数为size=3;
- 将res中每个元素都删除,由于size=3,所以需要删除3次。在第一次删除中,将res的首元素“a”记为temp 后再删除。由于“3”代表的是“def”,所以分别“d”、“e”、“f”拼接到“a”后面,将得到的值插入到res后,此时res为[“b”,“c”,“ad”,“ae”,“af”]。再分别将“b”和“c”以相同的方式删除,即可得到res为[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”, “ce”,“cf”]。
- 代码实现
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> res;
if (digits.length() == 0) return res;
res.push_back("");
vector<string> dict = {"","","abc","def","ghi","jkl","mno", "pqrs", "tuv", "wxyz"};
for(int i = 0; i < digits.length(); ++i){
int size = res.size();
for(int j = 0; j < size; ++j){
string temp = res[0];
res.erase(res.begin());
for(int k = 0; k < dict[digits[i]-'0'].length(); ++k){
res.push_back(temp + dict[digits[i]-'0'][k]);
}
}
}
return res;
}
};