比较两个字符串
var s1 = "mmmmm m nnnnn b&friend&Paul has heavy hats! &"
var s2 = "my frie n d Joh n has ma n b ma n b frie n ds n&"
====> "1:mmmmmm/=:nnnnnn/1:aaaa/1:hhh/2:yyy/2:dd/2:ff/2:ii/2:rr/=:ee/=:ss"
题目难度:4kyu
思路:
- 1、2代表是传入的第几个字符串, = 代表两个元素出现次数相同
- 首先把整个传入的字符串变成对象形式
// obj 默认传参 start 默认传参
function getStrObj(str, obj = {}, start = 0,) {
// 字符串正则匹配 只获取小写的英文==>数组===>字符串===>变成数组====>根据英文字符顺序排序====>字符串
str = str.match(/[a-z]/g).join('').split('').sort().join('')
// 默认从 0 开始,获取首次竖线的元素
var ele = str.charAt(start);
// 获取该元素最后出现的位置 计算出现次数 num - start + 1 (0,1 1 - 0 = 1 再加上 1 是个数,很简单的道理)
var num = str.lastIndexOf(ele);
// 给 obj 赋值 键为元素 值为出现的次数
obj[ele] = num - start + 1;
// 如果 num 不是最后一个 递归
if (num != str.length - 1) {
// 传入当前的str 已经赋值的obj 和num+1
return getStrObj(str, obj, num + 1)
} else {
// 得出最后的 obj
return obj
}
}
- 开始进行比较
function mix(s1, s2) {
// 把 s1 和 s2 变为新的对象
var newS1 = getStrObj(s1)
var newS2 = getStrObj(s2)
// 把新的对象的键合并为一个数组并去重
var keys = new Set(Object.keys(newS1).concat(Object.keys(newS2)));
var res = [];
// 循环遍历 keys 数组
keys.forEach(key => {
// c1 如果 newS1 中存在则取值不存在即为0,c2 同理,count 取 c1、c2 中大的那个值
var c1 = newS1[key] || 0, c2 = newS2[key] || 0, count = Math.max(c1, c2);
// 只取count大于1的值
if (count > 1) {
// [1, '=', 2][索引]
var from = [1, '=', 2][Math.sign(c2 - c1) + 1];
// 创建长度为 count 的数组 值为key 最后变成一个长度为 count 值为 count 个 key 的字符串
var str = [...Array(count)].map(_ => key).join('');
res.push(from + ':' + str);
}
});
// 排序之后 变成字符串
return res.sort((a, b) => {
return b.length - a.length || (a < b ? -1 : 1)
}).join('/');
}
网友评论