Day 09: Valid Palindrome

相信回文(palindrome)一定是在刚入门学习程序时一定会遇到的问题,
他虽然看起来很简单,但的确可以教我们很多演算法上的思维。
本篇会提供三种解法,一起来看从暴力法到优雅的解题的过程吧!

回文(palindrome)就是由前往後和由後往前念都像同的句子,像是'abcdcba'、'口罩罩口'...等等。


初学者一定有做过的方式,超直觉暴力法:

时间复杂度 : O(N^2) ,空间复杂度:O(N)

利用题目给你的字串反过来写一次,也就是先建一个空字串,把字一个个加(concat)上去,这个步骤其实会造成O(N^2)的时间复杂度,而後我们又要把建立好的结果和原本的字串来做比对

程序码会长得像下方⇊

function isPalindrome(string) {
  let reverseString = '';
  for (let i = string.length - 1; i >= 0; i--) {
    reverseString += string[i];
  }
  return string === reverseString;
}

当然我们不能在这里就放过这一题,再想想有没有更好的做法?

如果一开始我们不建立一个空字串,建立一个空的阵列,我们用push的方式把加到array 相较一开的方式,这样只花O(N)

然後把新建的array.join()的方式变成字串和原本相比

function isPalindrome(string) {
  const reverseString = [];
  for (let i = string.length - 1; i >= 0; i--) {
    reverseString.push(string[i]);
  }
  return string === reverseString.join('');
}

那有没有办法用递回(Recursion)的方式解决呢?

利用 return first === last and isPalindrome(middle)

但是Recursion的方式不一定有办法减少space

因为tail recursion依旧需要用到stack

程序码如下

function isPalindrome(string, i = 0) {
  const j = string.length - 1 - i;
  return i >= j ? true : string[i] === string[j] && isPalindrome(string, i + 1);
}

那有没有办法减少空间复杂度?

当然可以!好用的pointer又派上用场了!

来看pointer的解法!

function isPalindrome(string) {
  let start = 0;
  let end = string.length - 1;
  while (start < end) {
    if (string[start] !== string[end]) return false;
    start++;
    end--;
  }
  return true;
}

看完这写方式,Leetcode的题目指示加上一些变化,我们可以利用正则表达式

有关正则表达式,这里提供最近保哥线上提供的最新影片直播连接fb,有需要的可以再去观看!

下面提供解答参考拉!

var isPalindrome = function(s) {
  s = s.replace(/[^0-9a-zA-Z]+/gim, '');
  s = s.toLowerCase();
  let start = 0;
  let end = s.length - 1;
  while (start < end) {
    if (s[start] !== s[end]) return false;
    start++;
    end--;
  }
  return true;
};

明日题目预告:
摸过简单的Palindrome,当然要来看进阶一点的题目!Longest Palindromic Substring


<<:  D9 - 酸 V 啊酸 V8 引擎

>>:  Day10-React Hook 篇-打造自己的 Hook:Custom Hook

LINE BOT聊天机器人-查询天气资讯

遮是一篇超级没有语言技术性质的文章!请三思慎入!! 今天要来做查询天气的功能。 一样有事前作业: 1...

D3. 学习基础C、C++语言

D3: 资料型态指定格式 %c:以字元输出 %d:以10进位整数输出 %o:以8进位整数输出 %u:...

Linux网络诊断工具 mtr

MTR是Linux平台上一款非常好用的网络诊断工具,或者说网络连通性判断工具,集成了tracerou...

Day 01:什麽是演算法?

演算法这个名字给人一种充满艰深、繁复计算的感觉,不像我们生活中可以或需要学会的东西。 但其实演算法在...

[Day04] TS:如何把物件型别的所有属性名称取出变成 union type?试试看 keyof 吧!

前面两天的文章中我们谈到泛型(generics)的使用,以及如何透过 extends 来限制泛型可被...