JavaScript 程序:使所有字符串相等所需的最小移动次数
许多问题需要一定的专业知识和创造力才能解决。其中一个问题是确定使所有字符串相等所需的最小移动次数。在本文中,我们将探讨如何使用 JavaScript 编程解决此问题。首先,让我们定义问题。
问题陈述
给定一个字符串数组,我们需要找到使所有字符串相等所需的最小移动次数。在一次移动中,我们可以将字符串的第一个字符移动到同一字符串的末尾。
示例
考虑以下字符串数组
["abcd", "cdab", "bacd", "cdba"]
我们可以使用以下移动使所有字符串等于“abcd”
将第二个字符串的第一个字符移到末尾:“cdab” -> “dabc”
将第三个字符串的第一个字符移到末尾:“bacd” -> “acdb”
将第四个字符串的第一个字符移到末尾:“cdba” -> “dbac”
在这些移动之后,所有字符串都变为“abcd”。使所有字符串相等所需的最小移动次数为 2。
示例 1
Input: n = 4, arr[] = {"abcd", "cdab", "bacd", "cdba"}
输出:最小移动次数:2
示例 2
Input: n = 2, arr[] = {"molzv", "lzvmo"}
输出:最小移动次数:2
示例 3
Input: n = 3, arr[] = {"kc", "kc", "kc"}
输出:最小移动次数:0
现在让我们了解上述问题陈述的算法。
算法
让我们深入了解算法,以了解找到使所有字符串相等所需的最小移动次数所涉及的步骤
将变量“minCnt”初始化为一个非常大的值。
遍历数组中的每个字符串。
对于每个字符串,找到使所有字符串等于它的所需的最小移动次数。为此,遍历数组中的每个字符串并执行以下操作
将当前字符串附加到自身(以创建循环字符串)。
在循环字符串中查找当前字符串的索引。将此索引添加到计数器“cnt”。
遍历数组中的所有字符串后,将“minCnt”更新为“minCnt”和“cnt”之间的最小值。
返回“minCnt”作为使所有字符串相等所需的最小移动次数。
因此,让我们继续使用一个示例来实现此算法,在该示例中,我们使用 Javascript 实现此算法。
示例
该程序定义了一个名为“minMoves”的函数,它接受两个参数“str”和“n”。“str”是一个字符串数组,“n”是数组的长度。该函数遍历数组中的每个字符串,并且对于每个字符串,它计算将该字符串转换为数组中所有其他字符串所需的移动次数。移动定义为将字符串的第一个字符移到字符串的末尾。该函数返回将数组中的所有字符串相互转换所需的最小移动次数。
然后,该程序定义一个名为“str”的数组,并使用此数组及其长度调用“minMoves”函数。结果被记录到控制台,作为字符串“最小移动次数:”后跟将数组中的所有字符串相互转换所需的最小移动次数。
function minMoves(str, n) { let minCnt = Infinity; for (let i = 0; i < n; ++i) { let cnt = 0; for (let j = 0; j < n; ++j) { const temp = str[j] + str[j]; const index = temp.indexOf(str[i]); if (index !== -1) { cnt += index; } } minCnt = Math.min(cnt, minCnt); } return minCnt; } const str = ["abcd", "cdab", "bacd", "cdba"]; console.log("Minimum moves: " + minMoves(str, str.length));
结论
在本教程中,我们讨论了查找使所有字符串相等所需的最小移动次数的问题。我们提出了一个算法和相应的 JavaScript 程序来解决此问题。
该算法涉及遍历数组中的每个字符串并找到使所有字符串等于它的所需的最小移动次数。为此,我们通过将当前字符串附加到自身来创建一个循环字符串,然后在循环字符串中查找当前字符串的索引。我们使用此索引值更新计数器,并继续对数组中的所有字符串执行此操作。
最后,我们返回计数器的最小值作为使所有字符串相等所需的最小移动次数。通过在 JavaScript 中实现此算法,我们可以有效地解决任何给定字符串数组的此问题。