当前位置: 首页 > 知识库问答 >
问题:

递归/穷举地将点插入字符串

韦安顺
2023-03-14

我想在任何输入字符串中插入点。

例如,输入anystr,并输出所有可能性

a.nystr
an.ystr
any.str
anys.tr
anyst.r
a.n.ystr
a.ny.str
a.nys.tr
a.nyst.r
an.y.str
an.ys.tr
an.yst.r
......
anys.t.r
a.n.y.str
a.n.ys.tr
......
......
a.n.y.s.t.r

很容易插入一个点

a=anystr

for i in `seq 1 $((${#a}-1))`; do
    echo "${a:0:$i}.${a:$i}"
done

但是,如何对不同长度的输入字符串的所有可能性进行循环?

共有3个答案

元景天
2023-03-14

使用POSIX sh:

dot() {
  dot_helper()
    case $2 in
    '') printf '%s\n' "$1" ;;
     *) dot_helper "$1" "${2#?}"
        dot_helper "${1%"$2"}.$2" "${2#?}"
    esac

  case $1 in
  '') ;;
   *) dot_helper "$1" "${1#?}"
  esac
}
$ dot anystr
anystr
anyst.r
anys.tr
anys.t.r
any.str
any.st.r
any.s.tr
...
a.n.y.s.t.r
裴星洲
2023-03-14

以下是使用我在评论中提出的二进制设计思想的实现:

value="anystr"
len=$(( ${#value} - 1 ))
combos=$( bc <<< "2^($len)-1" )
count=0
periods=('' '.')
while [[ count -le  $combos ]]
do
  # Convert to binary - see https://stackoverflow.com/a/10278539/2203038
  binary_count=$( dc -e "$count 2op")
  # add leading 0's and a single trailing 0 (we never put a . after the last letter)
  binary_count=$( printf "%0${len}d" $binary_count )
  
  # loop through the binary_count and value - spitting out a letter and a '.' or ''
  result=''
  x=0
  while [[ x -le ${#value} ]]
  do
    result="$result${value:$x:1}${periods[${binary_count:$x:1}]}"
    x=$(( x + 1 ))
  done
  echo "$count: $binary_count $result"

 count=$(( count + 1 )) 

done

以下是结果:

0: 00000 anystr
1: 00001 anyst.r
2: 00010 anys.tr
3: 00011 anys.t.r
4: 00100 any.str
5: 00101 any.st.r
6: 00110 any.s.tr
7: 00111 any.s.t.r
8: 01000 an.ystr
9: 01001 an.yst.r
10: 01010 an.ys.tr
11: 01011 an.ys.t.r
12: 01100 an.y.str
13: 01101 an.y.st.r
14: 01110 an.y.s.tr
15: 01111 an.y.s.t.r
16: 10000 a.nystr
17: 10001 a.nyst.r
18: 10010 a.nys.tr
19: 10011 a.nys.t.r
20: 10100 a.ny.str
21: 10101 a.ny.st.r
22: 10110 a.ny.s.tr
23: 10111 a.ny.s.t.r
24: 11000 a.n.ystr
25: 11001 a.n.yst.r
26: 11010 a.n.ys.tr
27: 11011 a.n.ys.t.r
28: 11100 a.n.y.str
29: 11101 a.n.y.st.r
30: 11110 a.n.y.s.tr
31: 11111 a.n.y.s.t.r

我最近从bash改为python作为我的首选语言。所以我也倾向于在python中尝试:

value="anystr"
for x in range(2**(len(value)-1)):
  binary_value = x 
  for c in range(len(value)):
    print(value[c],end='')
    if binary_value & 1:
      print('.', end='')
    binary_value >>= 1
  print()

基于python实现的简单性,我觉得我可以回到bash实现并使它更简单(例如,将二进制值保持为int而不是string)。然而,我会让其他人提供一个更简单的bash答案(尽管我认为我们很难找到比jared更简单的答案!

农英杰
2023-03-14

下面是一个使用GNUsed的潜在解决方案,改编自https://codegolf.stackexchange.com/a/204510/95793:

echo "anystr" | eval echo $(gsed 's/\B/{,.}/g') | tr -s " " "\n"
anystr
anyst.r
anys.tr
anys.t.r
any.str
any.st.r
any.s.tr
any.s.t.r
an.ystr
an.yst.r
an.ys.tr
an.ys.t.r
an.y.str
an.y.st.r
an.y.s.tr
an.y.s.t.r
a.nystr
a.nyst.r
a.nys.tr
a.nys.t.r
a.ny.str
a.ny.st.r
a.ny.s.tr
a.ny.s.t.r
a.n.ystr
a.n.yst.r
a.n.ys.tr
a.n.ys.t.r
a.n.y.str
a.n.y.st.r
a.n.y.s.tr
a.n.y.s.t.r

\B是这种方法的关键\B是一个“反向”单词边界标记,即“非单词边界”标记,sed命令在每个点插入{,.},即。

echo "anystr" | gsed 's/\B/{,.}/g'
a{,.}n{,.}y{,.}s{,.}t{,.}r

{,.}然后由shell展开,即:

eval echo "a{,}"
a a

eval echo "a{,}n{,}"
an an an an

eval echo "a{,.}"
a a.

eval echo "a{,.}n{,}"
an an a.n a.n

eval echo "a{,.}n{,.}"
an an. a.n a.n.

因此,将它们放在一起,您可以获得预期的输出,并且可以使用tr将空格替换为换行符:

echo "anystr" | gsed 's/\B/{,.}/g'
a{,.}n{,.}y{,.}s{,.}t{,.}r

eval echo "a{,.}n{,.}y{,.}s{,.}t{,.}r"
anystr anyst.r anys.tr anys.t.r any.str any.st.r any.s.tr any.s.t.r an.ystr an.yst.r an.ys.tr an.ys.t.r an.y.str an.y.st.r an.y.s.tr an.y.s.t.r a.nystr a.nyst.r a.nys.tr a.nys.t.r a.ny.str a.ny.st.r a.ny.s.tr a.ny.s.t.r a.n.ystr a.n.yst.r a.n.ys.tr a.n.ys.t.r a.n.y.str a.n.y.st.r a.n.y.s.tr a.n.y.s.t.r

eval echo "a{,.}n{,.}y{,.}s{,.}t{,.}r" | tr -s " " "\n"
anystr
anyst.r
anys.tr
anys.t.r
any.str
any.st.r
any.s.tr
any.s.t.r
an.ystr
an.yst.r
an.ys.tr
an.ys.t.r
an.y.str
an.y.st.r
an.y.s.tr
an.y.s.t.r
a.nystr
a.nyst.r
a.nys.tr
a.nys.t.r
a.ny.str
a.ny.st.r
a.ny.s.tr
a.ny.s.t.r
a.n.ystr
a.n.yst.r
a.n.ys.tr
a.n.ys.t.r
a.n.y.str
a.n.y.st.r
a.n.y.s.tr
a.n.y.s.t.r

此外,您不需要使用 eval,它仅用于删除“步骤”,例如

echo "anystr" | gsed 's/\B/{,.}/g'
a{,.}n{,.}y{,.}s{,.}t{,.}r

echo a{,.}n{,.}y{,.}s{,.}t{,.}r | tr -s " " "\n"
anystr
anyst.r
anys.tr
anys.t.r
any.str
any.st.r
any.s.tr
any.s.t.r
an.ystr
an.yst.r
an.ys.tr
an.ys.t.r
an.y.str
an.y.st.r
an.y.s.tr
an.y.s.t.r
a.nystr
a.nyst.r
a.nys.tr
a.nys.t.r
a.ny.str
a.ny.st.r
a.ny.s.tr
a.ny.s.t.r
a.n.ystr
a.n.yst.r
a.n.ys.tr
a.n.ys.t.r
a.n.y.str
a.n.y.st.r
a.n.y.s.tr
a.n.y.s.t.r
 类似资料:
  • 在前面几节的例子中,可以发现每次函数被递归调用,参数会递减1,因此最终变为0。此时函数会立刻返回,不再做递归调用。这种情况--当函数结束而不再做递归调用--被称为基础情况。 如果一个递归永远不能到达基础情况,它会一直递归调用下去,程序永远不会终止。这称为无穷递归,这通常并不是一个好主意。 在大多数编程环境中,一个有着无穷递归的程序并不会真的永远运行下去。最终会出现中断,程序报告一个错误。这是目前我

  • 我是Python的超级新手,并试图创建一个非常简单的函数,用于更大的地图着色程序。 该函数的思想是将一组变量归于不同的区域(string1),并将颜色分配给它们(r、g、b),然后通过递归地查看一组区域边界(string2)来测试这些区域是否接触到相同颜色的另一个区域,以找到匹配的变量颜色。 输入格式如下:("Ar, Bg, Cb","AB, CB, CA")将返回True,这意味着没有相同颜色的

  • 问题内容: 我需要获取一个字符串,并通过获取char来递归地重新排列它,并按该char的形式将字符串上的char移到末尾,例如“ Hello world!”。,’l’=>“ Heo word!lll”我在理解递归思维方式时遇到了问题,所以我从这里开始: 谢谢您的帮助 :) 问题答案: 递归是在内部重用方法的实践。在这种情况下,我将提供一个解决方案来解释发生的情况: 如果执行: 这将产生所需的结果:

  • 编辑:我想出来了——放弃了这个设计,重新开始,它成功了!谢谢你的建议。 我正在做一个BST算法的家庭作业,我绝望地被困在插入方法上。我在网上找到的所有资源都有一个与我创建的版本相似的版本,但是我没有通过教授给我们的JUnit测试。我可以通过基本情况(root.payload==value的空根和二叉树)。不过,我似乎无法通过下一个测试。这是我的插入(root, value)方法代码: 最终返回的是

  • 问题内容: 我正在尝试查找字符串中字母的首次出现。例如,苹果中的p应该返回1。这是我拥有的: 它似乎似乎没有返回正确的值。 问题答案: 您的尝试很好,但是还不够。这是基于您的正确实现: 您的尝试存在两个问题: 在这一部分中,您已经找到了角色,因此正确的做法是停止递归,但您仍在继续。 在最后一个return语句中,您需要在递归调用中加1(如果最终找到了该字符),作为累加总索引号的一种方式。

  • 问题内容: 我想在Python中将变量引入字符串中。 例如,看下面的脚本。我只是想为图像起个名字,例如…到,或者如果您使用会计师,因为我可以替换部分价值链以生成计数器。 问题答案: data = self.cmd(“r.out.gdal in=rdata out=geo{0}.tif”.format(i)) self.dataOutTIF.setValue(“geo{0}.tif”.format(

  • 我编写了这个java-fx程序,它在没有递归实现的情况下工作得很好。我编写了操作lambda上的按钮,以确保程序在转换为递归之前正常工作。在过去的几个小时里,我一直在尝试找出两个必需的递归,以及如何使用按钮调用它们。onAction lambda表达式,但需要向正确的方向推动。这是我的。 我想做的是让按钮操作调用递归方法,但我对如何用对递归的调用替换当前操作感到困惑。 在熟睡之后,下面是我对这两个

  • 是否有注释或其他方法可以将非穷举的 switch 语句警告转换为错误?我希望某个方法或类在开关中未正确处理所有值,则会产生错误。 示例: 在代码中的其他地方,该枚举上有一个开关,如下所示 Java会给您一个警告,该开关不会处理所有枚举值。我想把这个警告变成一个错误(永久性的,不管个别IDE设置如何)。 请记住,在这种情况下,我无法更改原始,因此我希望编译器强制执行它。