【发布时间】:2019-05-07 20:34:15
【问题描述】:
给你两个字符串。一次移动,您可以选择其中任何一个,然后删除第一个(即最左边的)字符。
例如:
通过对字符串“where”应用移动,结果是字符串“here”。 通过对字符串“a”应用移动,结果是一个空字符串“”。 实现一个函数,计算为使给定字符串相等而应执行的最小移动次数。
注意事项:
两个字符串都由小写拉丁字母组成。 如果字符串已经为空,则不能再执行删除操作。
我的问题是我假设您需要遍历两个字符串才能继续比较它们是否相等。如果它们不相等,请增加计数器并再次循环。
但我不确定我是否同时正确地循环了两个字符串。
i < (s.length, t.length); 的语法是否正确?
这是我尝试过的:
function shiftLeft(s, t) {
let sArray = s.split("");
let tArray = t.split("");
let counter = 0;
for (let i = 0; i < Math.min(s.length, t.length); i++) {
if (s === t) {
return counter;
}
if (s !== t && s.length > t.length) {
sArray.shift("");
counter += 1;
}
if (s !== t && t.length > s.length) {
tArray.shift("");
counter += 1;
}
if (s !== t && t.length === s.length) {
sArray.shift("");
tArray.shift("");
counter += 1;
}
}
return counter;
}
console.log(shiftLeft("west", "test"));
但它给了我一个不正确的测试值 - "test" 和 "west" 的计数器应该只等于 2,这将返回 4。
是我的逻辑错了还是for循环的语法错了,还是两者兼而有之?
【问题讨论】:
-
算法上我会做一些更简单的事情。比较两个字符串的结尾并检查最长的相似字符串。在这种情况下将是“est”。两个字符串的剩余字符数的总和就是答案。
-
应该是
i < Math.min(s.length, t.length)。(s.length, t.length)只返回t.length,因为这就是,运算符在这样的表达式中所做的。 -
@4castle 好的,我继续将其更改为
i < Math.min(s.length, t.length)- 该函数仍返回 4,所以我的代码肯定有其他问题...... -
@CarlosAlvesJorge 这很有道理——我会试试的。
标签: javascript for-loop string-comparison