题目
https://leetcode.com/problems/find-all-anagrams-in-a-string/
题解
方法1:尝试构造一种“与顺序无关的哈希”
思考
是否可以构造顺序无关的哈希?例如,我们希望 aabc 与 bcaa 的哈希值相同。
思路
找到一种映射方式,使得在保证每一个字母都出现在 set 中的情况下,让不同字母具有不同的贡献度,计算每个字母的贡献度求 sum,从而实现“不同数量的字母组成的不同序列具有唯一 sum,相同数量的字母组合具有相同 sum,结果与顺序无关”。
结果
上述“映射方式”可以被证明是不存在的。
我仍然用代码实现了一遍,没想到 AC 了。方法有逻辑问题,但是通过了所有的测试用例。
例如,a到z都包含在字符串中的情况下,只要找到 a+b = c+d,就是反例。
反例
a aac bcdefghijklmnopqrstuvwxyz
a bbb bcdefghijklmnopqrstuvwxyz
其中,中间部分的 a+a+c = b+b+b
证伪
以下步骤可以证明 一定存在反例:
class Solution {
public List<Integer> findAnagrams(String s, String p) {
int target = 0;
Set<Character> set = new HashSet<>();
for (int i = 0; i < p.length(); i++) {
target += Math.pow(2, p.charAt(i) - 'a');
set.add(p.charAt(i));
}
ArrayList<Integer> list = new ArrayList<>();
if (s.length() < p.length