Javascript JS程序以指定的大小在指定的方向旋转给定的字符串

Javascript JS程序以指定的大小在指定的方向旋转给定的字符串,javascript,string,substring,anagram,Javascript,String,Substring,Anagram,函数必须采用两个字符串参数:一个是要旋转的字符串,另一个是表示在特定方向上以特定大小旋转任意次数的字符串。第二个字符串的形式为:X a X b X c。。。。。。。其中X表示旋转方向,即L或R。a,b,c。。。是整数,表示其左侧方向的大小不超过9 例如,如果这些是参数:abcde,l3r2r4 输出是肯定的 说明: 这里,旋转的次数是3。 应用第一个旋转L 3后,字符串为: “deabc”。这里,第一个字符是“d” 应用第二个旋转R2后,字符串为: “bcdea”。这里,第一个字符是“b” 应用

函数必须采用两个字符串参数:一个是要旋转的字符串,另一个是表示在特定方向上以特定大小旋转任意次数的字符串。第二个字符串的形式为:X a X b X c。。。。。。。其中X表示旋转方向,即L或R。a,b,c。。。是整数,表示其左侧方向的大小不超过9

例如,如果这些是参数:abcde,l3r2r4 输出是肯定的

说明:

这里,旋转的次数是3。 应用第一个旋转L 3后,字符串为: “deabc”。这里,第一个字符是“d” 应用第二个旋转R2后,字符串为: “bcdea”。这里,第一个字符是“b” 应用第三个旋转R4后,字符串为: “cdeab”。这里,第一个字符是“c” 因此,在所有旋转之后,第一个charstring字符串将是dbc,它是原始字符串abcde的子字符串的一个anagram

这是我尝试过但没有成功的地方


const task18 = (str1, str2) => {
  let count;
  for (let i in str2) {
    if (str2[i] === "L") {
      let ans = str1.substring(str2[i + 1]) + str1.substring(0, str2[i + 1]);
      count = ans[0];
      return ans;
    } else {
      return str1.substring(str1, str1.length - str2[i + 1]);
    }
  }
};

这是一个解决方案,不需要修改中间的字符串,只需在每次旋转后跟踪第一个字母的位置

//应用第一个旋转L3后,字符串为:“deabc”。这里,第一个字符是“d” //应用第二个旋转R2后,字符串为:“bcdea”。这里,第一个字符是“b” //应用第三个旋转R4后,字符串为:“cdeab”。这里,第一个字符是“c” //因此,在所有旋转之后,第一个charstring字符串将是dbc,它是原始字符串abcde的子字符串的一个anagram。 //检查结果是否为完整字符串的子字符串的字谜。 const isAnagram=full,part=>{ 让isPartAnagram=true; partA阵列=part.split; 因为我让我参加派对{ 设c=partAsArray[i]; 设pos=full.indexOfc; //如果字母不再是字符串的一部分,它就不是一个字谜。 如果位置==-1{ isPartAnagram=false; 回来 } //从字符串中删除字符。 满=满。子字符串0,位置+满。子字符串位置+1 } 返回isPartAnagram; } const task18=str1,str2=>{ //让我们去掉空白,我们不需要那个。 str2=str2.replace/\s/g; 让结果=; 设currPos=0; //mod用于确保数组边界没有问题 设mod=str1.length; 对于let i=0;i 您总是在第一次迭代中使用return退出循环。 子字符串的最后一次调用以字符串作为第一个参数,而应为数字。 计数=ans[0];把伯爵从错误的地方带走。它将从str2而不是ans中检索。 没有任何东西会试图找出这个字谜是否匹配 函数试图返回部分str1,但赋值是返回YES或NO。 最简单的部分是旋转。事实上,没有必要真正旋转str1。使用索引指向旋转后字符串的起始点更有效

困难的部分是找出构造的字符串是否是str1子字符串的一个字谜。困难在于str1中的某些字符可能是重复的,因此当您在重复的字母中选择错误的字符时,尝试匹配可能会失败。这可以通过使用递归和回溯来解决,尝试在重复字符中使用一个字符,然后使用下一个字符,直到成功,或者所有尝试都失败

您可以采取一些额外的措施来提高运行时间:当旋转字符串的旋转次数超过str1中的字符数时,您就可以返回NO

如果由于通过旋转重新访问了某个字符位置,因此旋转导致使用某个字符的字符串多于str1中出现的字符串,那么您也可以返回NO

对于递归部分,您可以首先查找str1中出现次数最少的字符,这样就不必重复多次。您还可以跟踪匹配字符在str1中的间距:如果它们的间距超过子字符串的总大小,则继续该方向是没有用的

所有这些措施的实施如下:

函数task18str ,轮换{ //转换第二个参数:提取单个旋转并转换为有符号偏移 旋转=旋转。替换/R\s*/g,-.match/-?\d/g.mapNumber; //进行简单检查以排除过长的旋转字符串 如果rotations.length>str.length返回否;//将选择太多字符 //由于可能存在重复字符,因此字符索引出现的寄存器 让出现次数=Object.fromEntriesArray.fromstr,c=>[c,[]; Array.fromstr,c,i=>实例[c].pushi; //对str中的字符进行计数,以便能够立即检测到错误。 let available=Object.fromEntriesArray.fromstr,c=>[c,引用[c].length]; //不实际旋转字符串,但保持当前索引 设电流=0; 让结果=[];//选择的字符 为了让旋转腐烂{ 设c=str[current=current+str.length+rot%str.length]; if!available[c]-返回否;//相同字符太多 结果:c; } //对字符重新排序,以使出现次数最少的字符 //在输入字符串中,首先输入。 //这将优化字谜的深度优先搜索。 result.sorta,b=>available[a]-available[b]; //对字谜匹配执行深度优先搜索 返回函数dfsi=0,first=str.length,last=-1{ //第一个/最后一个是str中已匹配的极端索引 如果last-first>=result.length返回false;//子序列将有间隙;回溯 如果i>=result.length返回true;//所有字符都在子序列中分配 设c=结果[i]; 设occ=发生次数[c]; 使用doccurrences=occ.length-可用[c];
对于let j=0;j,YES从何而来?如果是字谜,则为YES,否则NoSo返回值不应为布尔值,而应为字符串?此外,输入字符串中的字符是否唯一,或者是否存在重复字符?这是给出的唯一问题语句。如果字谜为YES,则ans应为YES;如果not结果为YES,则ans应为NO,但如果是,则给出NO同样是一个带有ans YES-linkinpark的测试用例,L6R5L4感谢您的努力。它几乎可以工作,但对于这些测试用例carrace来说失败了,L2R2L3应该返回NO,PNESUMONOTRAMICROSICICOVOLCANOSISFLOCCINAUCINHILIPILILITY R9R1L4L9应该返回YES确定了最后一个测试用例。您能解释为什么carrace,L2R2L3应该返回NO吗eturn NO?因为它不是一个字谜。您的解决方案在大多数测试用例中都失败,没有答案。谢谢所有用例都通过了…我不知道我要花多长时间才能写出如此高效的代码。再次感谢您的时间