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.
Example 1:
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
本周看耗子叔的编程范式,跳出了业务,跳出了手头的编程语言,分析编程的本质实现,发现大道至简,语言都是互通的,最终都是那些编程范式的特征组合。都是计算机大佬的特征封装。
编程本质
- 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