LeetCode刷题日记(Day5)

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”:

  1. 初始化res为[""],即往res中插入一个空字符串,记录res的元素个数size=1;
  2. 将res中每个元素都删除(类似于队列的pop操作),由于size=1,所以只需要删除一次。将要删除的字符串记为temp。由于“2”代表的是“abc”,则分别将“a”、“b”、“c”拼接到temp后,将得到的值插入到res后(类似于队列的push操作),此时res为[“a”, “b”, “c”],记录新的res的元素个数为size=3;
  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;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_36348299/article/details/88398585