1. StrStr

给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从 0 开始)。如果不存在,则返回 -1。

思路:核心点遍历给定字符串字符,判断以当前字符开头字符串是否等于目标字符串

答案代码

int strStr(string haystack, string needle) {
    int n = haystack.size();
    int m = needle.size();

    int j=0;
    for(int i=0;i<=(n-m);i++)
    {
        for(j=0;j<m;j++)
        {
            if(haystack[i+j]!=needle[j])
                break;
        }

        if(j==m)
        {
            return i;
        }
    }

    return -1;
}

2. Subsets

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

思路:这是一个典型的应用回溯法的题目,简单来说就是穷尽所有可能性,算法模板如下

result = []
func backtrack(选择列表,路径):
    if 满足结束条件:
        result.add(路径)
        return
    for 选择 in 选择列表:
        做选择
        backtrack(选择列表,路径)
        撤销选择

答案代码

vector<vector<int>> subsets(vector<int>& nums) {
    // 保存最终结果
    vector<vector<int> > res;
    // 保存中间结果
    vector<int> li;

    backtrack(nums,0,li,res);

    return res;
}

// nums 给定的集合
// pos 下次添加到集合中的元素位置索引
// li 临时结果集合(每次需要复制保存)
// res 最终结果
void backtrack(vector<int>& nums, int pos, vector<int> li,vector<vector<int> >& res)
{
    // 把临时结果保存到最终结果    
    res.push_back(li);

    // 选择、处理结果、再撤销选择
    for(int i=pos;i<nums.size();i++)
    {
        li.push_back(nums[i]);
        backtrack(nums, i+1, li, res);
        li.pop_back();
    }
}