我在最近的一次采访中遇到了这个问题。
我们给了两个整数数组,我们需要检查第一个数组是否可以转换为第二个数组。允许的唯一操作如下:从第1个数组中选择任意3个相邻元素,然后右旋转它们,即{a,b,c} => {c,a,b}。我们可以多次应用此操作。
我尝试了递归解决方案,但我需要一种更好的方法。 在我的递归解决方案中,我试图通过从左到右查找最接近的位置并进行所需的操作数,来使第二个数组的第一个元素与第一个数组的元素相等。因此,当第一个元素匹配时,我对其余数组进行递归调用。 即让a = {1,2,3,4}和b = {4,1,3,2}。我们需要将数组a转换为b。 因此,{1,2,3,4} => {1,4,2,3} => {2,1,4,3} => {4,2,1,3}并作为a [1] = b [1],对2到n进行递归调用。
如何解决此类问题?预先感谢。
答案 0 :(得分:0)
我们可以多次应用此操作。
但是您的标题在说其他话。
因此,给定两个大小为N的字符串S1和S2,其中字符串中的不同字母计数相同,那么只有我们才能想到转换。
我们可以匹配从1到N-2的所有字符
在所有情况下都在两个字符串中。
每次我们从第一个字符串中选取一个字符时,该字符的移动都可以
-2+1-2+1-2+1..............
我们可以将字符串中提取的字符移回这些位置
-2,-1,-3,-2,-4,-3....
匹配N-2个字符后
如果最后两个字符匹配,那么我们已经转换了字符串,但是它们没有自动匹配,那么我们将无法做任何进一步的操作。
因此,问题出在最后两个字符上,我们对两个字符的移动无能为力。
例如
S1 = abdc
S2 = abcd
我们不能在这里将 abdc 更改为 abcd ,因为从 abdc 中,我们只能进行24个排列中的12个排列
abdc,dabc,acbd,bdac,dcab,bacd,adcb,bcda,dbca,cbad,cadb,cdba
通过计算倒置次数获得最佳答案
深入了解它与字符串中反转次数的关系
如果两个字符串中的倒数均为偶数或奇数,则只能进行转换。
查找字符串倒置
int invcount=0,charcount[26]={0};
for(i=0;i<s.size();i++)
{
for(j=s[i];j<='z';j++)
invcount+=charcount[j-s[i]];
charcount[s[i]-'a']++;
}
cout<<invcount;