ARST打卡-第一週

Algorithm


Question: Longest Palindromic Substring

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.javascript

Example 1:java

Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
複製代碼
解法

第一想法是循環遍歷字符串,判斷子字符串是不是迴文子串,複雜度O(n^3).後來發現這是暴力解法QAQ.正則表達式

/** * @param {string} s * @return {string} */
var longestPalindrome = function(s) {
    let maxLen = 0;
    let begin = 0;
    let end = 0;
    for(let i=0;i<s.length;i++){
        for(let j = i; j < s.length;j++){
            if(isPalindromicStr(s, i,j)){
                let len = (j - i)+1;
                if(len > maxLen){
                    begin = i;
                    end = j;
                    maxLen = len;
                }
            }
        }
    }
    return s.substr(begin, maxLen);
};

// 判斷是不是重複子串
function isPalindromicStr(str, begin, end){
    let i = begin || 0;
    let j = end || str.length - 1;
    if(j < 0){
        return false;
    }
    while(i <=j ){
        let charA = str.charAt(i);
        let charB = str.charAt(j);
        if(charA != charB){
            return false;
        }
        i++;
        j--;
    }
    return true;
}
複製代碼

看了網上的解法,優化版O(n^2)算法

var longestPalindrome = function(s) {
    let res = "";
    let cur = "";
    for(let i = 0; i < s.length; i ++){
        for(let j = i; j < i + 2; j ++){
            let left = i;
            let right = j;
            while(s[left] && s[left] === s[right]){
                cur = s.substring(left, right + 1);
                if(cur.length > res.length) res = cur;
                left --;
                right ++;
            }
        }
    }
    return res;
};
複製代碼

動態規劃算法待補充QAQ編程

Review


本週看耗子叔的編程範式,跳出了業務,跳出了手頭的編程語言,分析編程的本質實現,發現大道至簡,語言都是互通的,最終都是那些編程範式的特徵組合。都是計算機大佬的特徵封裝。markdown

編程本質

  • Pragrams = Algorithms + Data Structures
  • Algorithms = Logic + Control

若是將代碼的邏輯和控制有效的分開,那麼代碼就會變得更易於改進和維護。編程語言

有效的分離Logic、Control、Data是寫出好程序的關鍵所在函數式編程

代碼複雜度的緣由函數

  • 業務邏輯的複雜度決定了代碼的複雜度
  • 控制邏輯的複雜度 + 業務邏輯的複雜度 => 程序代碼的混亂不堪
  • 絕大多數程序複雜的根本緣由:業務邏輯與控制邏輯的耦合
So,如何分離Logic 和 Control?
  • State Machine
    • 狀態定義
    • 狀態變遷條件
    • 狀態的Action

    Redux的實現優化

  • DSL - Domain Specific Language
    • Html、Sql、正則表達式、AWK、Unix Shell Script……
  • 編程範式
    • 面向對象:委託、策略、橋接、修飾、Ioc/DIP、MVC……
    • 函數式編程:修飾、管道和封裝
    • 邏輯推導式編程:Prolog
相關文章
相關標籤/搜索