字符串旋转不变标识符的构建与正确性证明技术问询
字符串旋转不变标识符的构建与正确性证明技术问询
最近我碰到了一道编程小题:需要写一个布尔函数,判断字符串A是不是通过旋转字符串B的字母得到的。举个例子,当A是abid、B是bida时,can_shift(A, B)应该返回True。常见的解法是生成B的所有可能旋转结果,再逐个和A对比,但我虽然不是数学专业出身,却对这类问题特别感兴趣——我想构造一个旋转不变的字符串标识符函数,要么证明它是正确可行的,要么证明不存在这样的函数。
我自己琢磨出了一个初步思路,想跟大家探讨:
- 先定义字符集为A,设计一个函数
f(x):它的输入是长度为3的字符串(也就是一个字符三元组),输出是一个长度为|A|^3的0-1向量。这个向量就像指示函数一样,只有对应这个三元组的维度是1,其余全为0。 - 再定义函数
T(s):输入字符串s,返回s中所有连续三元组的集合。比如当s是abid时,T(s)就包含abi、bid这两个三元组(如果考虑循环旋转的话,是不是还要加上首尾衔接的ida和dab?我暂时还没确定这部分的细节)。 - 我的想法是把
T(s)里所有三元组对应的f(x)向量加起来,得到一个总向量,把这个总向量作为字符串s的旋转不变标识符——直觉上不管怎么旋转字符串,里面的三元组集合(如果是循环考虑的话)应该是不变的,但我不确定这个思路是否严谨,也不知道该怎么证明它的正确性,或者有没有更简洁、更可靠的构造方法?
备注:内容来源于stack exchange,提问作者moe asal
相关产品推荐
相关产品推荐

