力扣:判断回文串(JavaScript)
- 题目
- 解法一:单层for循环
- 解法二:while循环
- 解法三:for+push
- 解法四:递归
题目
判断一个字符串是否是回文串,比如:12321、3443、8338、83438都是回文串。而不是规律的就不是如果12345,abcde。四种解法,附全部源码。
解法一:单层for循环
时间复杂度为:O(n),单层for循环
function demo(i) {i=""+i;if(i== '0')return true;for(let temp=0;temp<i.length;i++){if(i[temp]!=i[i.length-1-temp]){return false;}}return true;
}
let truNum = 12321
let falNum = 1221
let truStr = '1234321'
let falStr = '12345'
console.log(demo(truNum));
console.log(demo(falNum));
console.log(demo(truStr));
console.log(demo(falStr));
首先我们定义一个函数,把传入参数变成字符串,然后使用for循环,判断它的长度为temp和长度为最大长度-temp-1是否相等,如果都相等,则返回true,否则返回false。这种方法主要判断它们里面的内容是否是对称的。
解法二:while循环
时间复杂度:O(n)
function demo(i) {i=""+i;if(i=='0')return true;let small=0;let big=i.length-1;while(small<big){if(i[small]!=i[big]){return false;}small++;big--;}return true;}let truNum = 12321let falNum = 1221let truStr = '1234321'let falStr = '12345'console.log(demo(truNum));console.log(demo(falNum));console.log(demo(truStr));console.log(demo(falStr));
while和for循环时间复杂度相同,不同的是while定义了两个变量用于存储最小长度和最大长度。在循环中判断两个字符长度之间的值是否相同,不相同则false
,否则最小长度++,最大长度–,直到最小长度不小于最大长度。退出循环返回true
。
解法三:for+push
时间复杂度:O(2/n)、O(2/n-1)
function demo(i) {i = "" + i;let arr = [];if (i == '0') return true;if (i.length % 2 != 0) {let j = i.length / 2 - 1for (let temp = 0; temp < i.length / 2 - 1; temp++) {arr.push(i[temp])let h = parseInt(i.length - 1 - temp)console.log(arr[temp], i[h]);if (arr[temp] != i[h]) {return false;}}} else {for (let temp = 0; temp < i.length - 1; temp++) {let j = i.length / 2for (let temp = 0; temp < i.length / 2; temp++) {arr.push(i[temp])let h = parseInt(i.length - 1 - temp)console.log(arr[temp], i[h]);if (arr[temp] != i[h]) {return false;}}}}return true;}let truNum = 12321let falNum = 1221let truStr = '1234321'let falStr = '12345'console.log(demo(truNum));console.log(demo(falNum));console.log(demo(truStr));console.log(demo(falStr));
还是for循环,用push装进一个数组中,然后进行遍历,判断字符长度是否为奇数。进行对应判断。只遍历长度的一半或长度的一半减1,同时字符串如果是0则直接返回true。
解法四:递归
时间复杂度:O(n/2)
function demo(str,min,max) {if(min>=max || str == '0') return true;if(str[min]!=str[max-1]) return false;return demo(str,++min,--max);}let truNum = 12321let falNum = 1221let truStr = 'abcba'let falStr = '12345'console.log(demo(truNum,0,5));console.log(demo(falNum,0,4));console.log(demo(truStr,0,5));console.log(demo(falStr,0,5));
递归实现方式:三个参数,第一个为字符串,第二个为0,也就是最小长度,第三个为字符串长度,如果最小长度>=最大长度或者str为0则返回true
,如果最小长度不等于大长度的字符串值返回false
,否则返回字符串,最小长度+1,最大长度-1.