zoukankan      html  css  js  c++  java
  • Leetcode 题解记录

    22. 括号生成

    题解: dfs.

    1. dfs(string str, int i):  str表示 前  i-1 个 括号组成的合法括号,   i 表示 现在要插入第 i 个小括号  "()",  这里不需要 考虑插入的小括号里面还有小括号,因为这样的操作会在  i+1, i+2, ... 中去尝试.

    2. 对于一个合法的括号组合,我们可以在字符串头部, 以及每个左括号的后面添加一个小括号 "()".

    3. 结果可能会有重复, 需要去重.

    vector<string> generateParenthesis(int n) {
            set<string> _set;
            function<void(string, int)> dfs = [&](string brackets, int level){
                if(!level){
                    _set.insert(brackets);
                    return;                
                }
                dfs("()" + brackets, level - 1);
                for(int i=0; i<brackets.size(); ++i){
                    if(brackets[i] == '(')
                        dfs(brackets.substr(0,i+1)+"()"+brackets.substr(i+1), level-1);
                }     
            };
            dfs("", n);
            vector<string> ans;
            for(auto str : _set)
                ans.emplace_back(str);
            return ans;
    }
    

      

    剑指 Offer 10- I. 斐波那契数列

    题解: 斐波那契数列公式 : f[i] = f[i-1] + f[i-2]

    1. 注意点: 数论知识 (a + b) mod n == ( a mod n + b mod n ) mod n 

        int fib(int n) {
            long long a[3] = {0, 1, 1};
            if(n <= 2)
                return a[n] % mod;
            for(int i=3; i<=n; ++i){
                a[0] = a[1], a[1] = a[2];
                a[2] = (a[1] + a[0]) % mod; // 注意点: 取余不影响结果
            }
            return a[2];
        }
    

     

    5. 最长回文子串

    题解: 动态规划(其中一种)

    令 dp[i][j] 表示 字符串 s[i]...s[j] 是否为回文串.  i<=j .

    边界条件: 

      1. i == j,   dp[i][j] = true;

      2. i > j && i+1 <= j-1, dp[i][j] = dp[i+1][j-1]

      3. i+1 == j,  s[i] == s[j],  dp[i][j] = true;

      4. 其余情况, dp[i][j] = false;

    最后, 选择长度最长的作为答案, 即  max( (j-i+1) ). 

    细节: 递归表达直接,但是函数调用开销比较大,而且需要使用记忆化搜索优化. 如果采用遍历,  对于 "i" 的遍历需要从大到小.

        string longestPalindrome(string s) {
            int size = s.size();
            vector<vector<bool>> dp(size, vector<bool>(size));
            string ans = "";
            for(int i=size-1; i>=0; --i){
                for(int j=i; j<size; ++j){
                    if(i == j)
                        dp[i][j] = true;
                    else if(s[i] == s[j] ){
                        if((i+1)>=(j-1))
                            dp[i][j] = true;
                        else dp[i][j] = dp[i+1][j-1];
                    }
                    else dp[i][j] = false;
                    if(dp[i][j] && (j-i+1 > ans.size()))
                        ans = s.substr(i, j-i+1);
                }
            }
            return ans; 
        }
    

      

  • 相关阅读:
    第一周作业
    第一次作业
    第八周作业
    第七周作业
    第六周作业
    第五周作业
    第四周作业
    第三周作业
    第二周作业
    第一周作业2
  • 原文地址:https://www.cnblogs.com/xinwang-coding/p/15226331.html
Copyright © 2011-2022 走看看