1.判定是否互为字符重排
题目:给定两个字符串 s1
和 s2
,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
思路:根据字典序排列,判断是否相等即可
/**
* @param {string} s1
* @param {string} s2
* @return {boolean}
*/
var CheckPermutation = function(s1, s2) {
s1 = [...s1].sort();
s2 = [...s2].sort();
return s1.join() == s2.join();
};
2.URL化
题目:
URL化。编写一种方法,将字符串中的空格全部替换为%20。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。(注:用Java实现的话,请使用字符数组实现,以便直接在数组上操作。)
思路:先按照目标长度截取,然后替换
/**
* @param {string} S
* @param {number} length
* @return {string}
*/
var replaceSpaces = function(S, length) {
return S.slice(0,length).replace(/ /g,'%20')
};
3.回文排列
题目:
给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。
回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。
回文串不一定是字典当中的单词。
思路:回文排列,则最多只有一个字符出现的次数是奇数次
/**
* @param {string} s
* @return {boolean}
*/
var canPermutePalindrome = function(s) {
const map = new Map();
for (const n of s) {
map.set(n, (map.get(n) || 0) + 1);
}
let c = 0;
for (const n of map.values()) {
if (n % 2) c++;
if(c>1)return false
}
return true;
};
4.字符串压缩
题目:
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
思路:依次遍历,记录上个出现的字符以及出现次数
/**
* @param {string} S
* @return {string}
*/
var compressString = function(S) {
const l = S.length;
let res = "";
let n = 1;
for (let i = 1; i < l; i++) {
if (S[i] !== S[i-1]) {
res += `${S[i-1]}${n}`;
n = 1;
} else {
n++;
}
}
res += `${S[l-1]}${n}`;
return res.length < S.length ? res : S;
};
5.字符串轮转
题目:字符串轮转。给定两个字符串s1
和s2
,请编写代码检查s2
是否为s1
旋转而成(比如,waterbottle
是erbottlewat
旋转后的字符串)。
思路:可以先对第二个字符串遍历,遇到和第一字符串开头字符相等时,就截取比较
/**
* @param {string} s1
* @param {string} s2
* @return {boolean}
*/
var isFlipedString = function(s1, s2) {
const l1 = s1.length;
const l2 = s2.length;
if(s1==s2)return true
if (l1 !== l2) return false;
for (let i = 0; i < l2; i++) {
if (s1[0] !== s2[i]) continue;
if (s2.slice(i) + s2.slice(0, i) == s1) return true;
}
return false;
};
注意观察,如果s2旋转可得s1,那么s2+s2必定包括s1
/**
* @param {string} s1
* @param {string} s2
* @return {boolean}
*/
var isFlipedString = function(s1, s2) {
const l1 = s1.length;
const l2 = s2.length;
if(s1==s2)return true
if (l1 !== l2) return false;
if(`${s2}${s2}`.includes(s1))return true
return false;
};