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
相关文章
相关标签/搜索