请教一道Google面经题

题目很多人在面经里贴过:给定一个字符串s,问能不能转化成另一个字符串p,条件是每次转换要把所有相同的字母一起变动,例子如: abca(两个a一起变) -> dbcd(变c) -> dbed(变b) -> dced。所以abca能转化成dced,return true。
我目前只能想到:
首先必须原来s中字符相等的几个位置,在p中都要被转化成同一个字符,否则 return false
请大家指点一下思路,或者说下证明过程,谢谢啦!

我的想法是如果 abca 把 b 改成 a 之后得到 aaca, 再次变换的时候,3个a都需要同时修改的话,那么说明每次变换只可能会增加联动的字符的数量,但是绝对不会减少。所以可以记下来联动字符的位置,目标字符串中如果这些位置上的字符不相同的话,就返回FALSE。
abca -> {0, 3}, 不需要记最开始相同的字符是什么, 然后判断 dced 中{0,3}两个位置上的字母是不是相同的。

你想到的没问题啊,s中每个字符,对它出现的所有位置,p在这些位置上的字符一定相同,否则返回false。因为s往p转变的时候,这些位置会同时变成一个字符,所以不论怎么变这些位置一定是同一字符,所以如果p在这些位置上由不同字符的话永远也变不出p。

按你看位置的想法就是LC原题了,这道题的问题在于你在变化的过程中需要用到辅助字母,所以多了一个限制,在你判断位置的基础上要检查原字符串和目标字符串中字母映射是否存在环,每有一个环就意味着你要多用一个字母辅助变换,所以你要知道能作为辅助字母的数量是否大于等于环的数量,这是比LC原题要多考虑的点

应该是记录一个 map(char to char),把原串中的字符映射为目标串的相应位置的字符。如果冲突,则返回 false。

高频题了, 参考 谷歌 residency 面经题