最近在学习的时候到了基础算法这一章节,让我对js内置对象方法的掌握还有思维逻辑都得到了提升,所借此机会来写一写学习心得和总结。下面这篇文章主要介绍了利用javascript实现翻转字符串与回文的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
翻转字符串
翻转字符串(reverse a string),就是把字符串倒序处理的意思,比如给定一个字符串”hello”,翻转后应该返回”olleh”。
测试用例
reversestring(hello) 应该返回 “olleh”
reversestring(greetings from earth) 应该返回 “htrae morf sgniteerg”
实现思路
这里说最方便的方法就是将字符串转成数组,再颠倒数组并转成字符串返回。需要用到字符串对象和数组对象的内置方法:
string.split()
array.reverse()
array.join()
具体可以去看javascript参考手册
function reversestring(str) {
return str.split('').reverse().join('');
}
reversestring("hello");
一句return搞定,很简单有木有?!
在此基础上来看看回文是怎么玩的⬇️
回文
“madam,i'madam.” 这是亚当在伊甸园里碰上夏娃说的第一句话,这句话正着读和反着读一模一样,这样的句子就是回文,英文里叫palindrome。
举个栗子——“上海自来水来自海上”,这句话顺着读和反着读都是相同的,还有很多英语单词也是:level、madam、radar、lol(哈哈哈)…
测试用例
palindrome("race car") 应该返回 true
palindrome("not a palindrome") 应该返回 false
palindrome("0_0 (: /-\ :) 0-0") 应该返回 true
实现思路
我们需要写一个叫palindrome()的方法,传入一个叫str的参数,如果str是一个palindromes将返回true,反之为false。
需要注意将标点符号和空格去掉并touppercase or tolowercase后再进行判断。
需要用到以下知识点:
正则表达式 (regular expression) ,用来过滤符号和空格
string.replace() 替换与正则表达式匹配的子串
string.tolowercase() 把字符串转换为小写
关于正则表达式
这里要求匹配大小写英文字母和整数,任何标点符合和空格将被过滤掉。所以可以使用 /[^a-za-z0–9]/g 或者 /[\w_]/g
[^a-z] 匹配非26个大写字母中的任意一个
[^a-z] 匹配非26个小写字母中的任意一个
[^0-9] 匹配非0到9中的任意一个数字
[^_] 匹配非下划线
^ 匹配字符串的开始
\w 注意是小写,匹配字母或数字或下划线或汉字
\w 注意是大写,匹配任意不是字母、数字、下划线、汉字的字符,等价于[^a-za-z0-9_]
g 表示全局搜索
这是我的方法:
function palindrome(str) {
str = str.replace(/[\w_]/g,'').tolowercase();
var reversestr = str.split('').reverse().join('');
return str===reversestr;
}
palindrome("eye");
我在网上看到还可以用for循环来实现:
function palindrome (str) {
var reg = /[\w_]/g,
regstr = str.tolowercase().replace(reg, ''),
len = regstr.length;
for (var i = 0, halflen = len / 2; i < halflen; i++){
if (regstr[i] !== regstr[len - 1 - i]) {
return false;
}
}
return true;
}
这个思路很巧妙的运用了回文的特点,把整个字符串切成一半,循环遍历并依次判断首尾字符是否相等。
还有个运用了递归的实现:
function palindrome (str) {
// 删除字符串中不必要的字符
var re = /[\w_]/g;
// 将字符串变成小写字符
var lowregstr = str.tolowercase().replace(re, '');
// 如果字符串lowregstr的length长度为0时,字符串即是palindrome
if (lowregstr.length === 0) {
return true;
}
// 如果字符串的第一个和最后一个字符不相同,那么字符串就不是palindrome
if (lowregstr[0] !== lowregstr[lowregstr.length - 1]) {
return false;
} else {
return palindrome(lowregstr.slice(1, lowregstr.length - 1));
}
}
感觉另外两个实现思路比我屌多了,自己在编程的路上才走没多远,一步一步来吧。
对了,别纠结翻转字符串和回文的区别了!翻转字符串仅仅是将倒序后的字符串返回;而回文面对的则是更长更复杂的句子,需要将过滤掉空格和标点符号的句子和倒序后的句子比较是否相等。
更多javascript基础练习之翻转字符串与回文。