给你两个字符串 s 和 t ,请你通过若干次以下操作将字符串 s 转化成字符串 t :
选择 s 中一个 非空 子字符串并将它包含的字符就地 升序 排序。
比方说,对下划线所示的子字符串进行操作可以由 “14234” 得到 “12344” 。
如果可以将字符串 s 变成 t ,返回 true 。否则,返回 false 。
一个 子字符串 定义为一个字符串中连续的若干字符。
解题思路:
参考大佬的思路:
我们可以发现任意两个数a[i],a[j],若a[i]<aj,无论怎么变,a[i]都不能到a[j]后去。
也就是说相对关系不会发生改变,也就是每部分不会产生新的逆序对。
所以我们只要看看是否逆序对改变了即可。
这里借鉴大佬的代码:
class Solution {
public:
bool isTransformable(string s, string t) {
int len=s.size();
if(t.size()!=len) return false;
queue<int> g[10];
for(int i=0;i<len;++i)
{
g[(s[i]-'0')].push(i);
}
for(int i=0;i<len;++i)
{
int k=t[i]-'0';
if(g[k].empty()) return false;
int h=g[k].front();
g[k].pop();
for(int j=0;j<k;++j)
{
if(!g[j].empty()&&g[j].front()<h) return false;
}
}
return true;
}
};
在没有出现新的逆序对的前提下,k之前的所有队头<k的队头的情况能够被pop()操作消除掉了。所以如果仍能够出现pos[j].front() < pos[k].front(),代表产生了新的逆序对