如何递归/穷举地为任意长度字符串插入点并生成所有可能结果?
生成字符串所有插点组合的Bash实现
要生成字符串所有插点组合,核心思路是枚举所有插点位置的开关状态——每个字符间隙要么插点,要么不插,对应二进制位的0和1。比如长度为6的字符串有5个间隙,用5位二进制数就能表示所有可能的插法(1到31对应至少插一个点的情况;如果要包含原字符串就从0开始)。
下面是完整的Bash脚本,直接就能用:
#!/bin/bash # 读取输入字符串 read -p "输入字符串: " str [[ -z "$str" ]] && echo "字符串不能为空" && exit 1 len=${#str} (( gaps = len - 1 )) # 总共有2^gaps种组合,去掉原字符串的话是2^gaps -1 max=$(( (1 << gaps) - 1 )) for ((i=1; i<=max; i++)); do # 把当前数字转成二进制,补前导零到gaps位 bin=$(printf "%0${gaps}d" $(bc <<< "obase=2; $i")) result="" # 遍历每个字符,结合二进制位决定是否插点 for ((j=0; j<len; j++)); do result+=${str:$j:1} # 不是最后一个字符的话,检查对应二进制位是否为1,是则插点 if (( j < gaps )); then [[ ${bin:$j:1} == "1" ]] && result+="." fi done echo "$result" done
脚本说明:
1 << gaps:等价于计算2的gaps次方,快速得到最大枚举数printf "%0${gaps}d":把二进制数补前导零,保证位数和间隙数一致,方便逐个位置判断- 内层循环逐个拼接字符,每处理一个字符(除了最后一个),就看对应二进制位是否为1,是则插入
.
示例运行:
输入anystr,会输出从a.nystr、an.ystr一直到a.n.y.s.t.r的所有31种组合。
如果需要包含原字符串(不插任何点的情况),只需要把循环起始的i=1改成i=0即可。
内容的提问来源于stack exchange,提问作者wsdzbm
相关产品推荐
相关产品推荐

