这道题的思路来自同宿舍的一只大神琨哥,简单来说就是用“十叉树”存储所有电话号码,边存储边查重。
我们用“十叉树”从第1层开始(认为根节点是0层)存储字符串,第i层存储字符串的第i位。这样就有一个比较直观的前缀判断规则:如果一个字符串A是另一个字符串B的前缀,那么它的末尾一位必然在由B构成的路径中。程序要做的就是标记每一个这样的“尾巴”如果发现有“尾巴”在另一个字符串的路径中或者两个尾巴重合了(就是两个字符串完全相同的情况),则必然不一致。反之,如果没有任意两个字符串有前缀关系,电话号码就一致了。
详细过程举例:
比如样例代码的三个号码
911
97625999
91125426
我们这样建立树:
根节点为示意节点,不表示信息。
生成根节点的第9个孩子,生成第9个孩子的第1个孩子,生成生成第9个孩子的第1个孩子的第1个孩子,字符串结束,标记这个节点为一个“尾巴”。
生成根节