doocs/leetcode

第三题不解,关于p指针

cnkeeper opened this issue · 3 comments

原文
你有提到为了防止p指针回溯,不太清除这是为什么。)

if(map.containsKey(chars[q])){
 p=map.get(chars[q])+1;
}
map.put(chars[q],q);
max=Math.max(max,q-p+1);

这样有什么问题吗,求解!

有问题的,因为前面遍历过的字符都放入 map 中了,你直接使用 map.get(chars[q]) + 1 获得下标,并赋给 p,p 指针就可能往回走了。我那里举了个例子 abba,如果是下面这种情况。

a b b a
    ↑ ↑
    p q

p 此时指向第二个 b,q 指向最后的 a,此时 map中包含 chars[q],即包含a,此时你那样赋值的话,p=0+1,即p=1,p指针往回走了。

要确保 p,q 之间不包含重复字符,你p指针回溯过后,p,q之间就包含两个字符b了。

有问题的,因为前面遍历过的字符都放入 map 中了,你直接使用 map.get(chars[q]) + 1 获得下标,并赋给 p,p 指针就可能往回走了。我那里举了个例子 abba,如果是下面这种情况。

a b b a
    ↑ ↑
    p q

p 此时指向第二个 b,q 指向最后的 a,此时 map中包含 chars[q],即包含a,此时你那样赋值的话,p=0+1,即p=1,p指针往回走了。

豁然开朗,谢谢回复!