如何生成这些子字符串? [关闭]

Posted

技术标签:

【中文标题】如何生成这些子字符串? [关闭]【英文标题】:How to generate those substrings? [closed] 【发布时间】:2021-12-04 13:28:50 【问题描述】:

例如:

string0 = '288/24x6=18x13x8'

string1 = '8/24x6=18x13x8'
string2 = '8/24x6=18x13x8'
string3 = '8824x6=18x13x8'
string4 = '88/4x6=18x13x8'
...
stringX = '2/24x6=18x13x8'
stringX+1 = '2824x6=18x13x8'
...

不使用任何模块或库,例如itertools等...

基本上,删除2个字符,生成所有可能的子串。

【问题讨论】:

那么,这个例子中的string1和string2有什么区别呢? 在 string1 中,第一个字符 '2' 和第二个字符 '8' 被删除。在 string2 中,第一个字符“2”和第三个字符“8”被删除。 【参考方案1】:

如果您出于某种奇怪的原因想要一个没有任何模块的解决方案并且您总是删除 2 个字符,您可以遍历可能要删除的位置的组合,然后使用字符串切片来删除这些位置。

如果您不想要重复的字符串(就像具有重复数字序列的字符串一样),您可以使用一个集合来只保留唯一的字符串:

orig = '288/24x6=18x13x8'
strings = set()
print(orig)

for outer_pos1 in range(len(orig)):
    for pos2 in range(len(orig)):
        # avoid overwriting outer loop variable for next inner iter.
        pos1 = outer_pos1
        if pos1 == pos2:
            continue
        if pos1 > pos2:
            pos1,pos2 = pos2,pos1
        new_string = orig[:pos1] + orig[pos1+1:pos2] + orig[pos2+1:]
        strings.add(new_string)

for new_string in strings:
    print(new_string)

但请注意,如果您的原始字符串很长并且您进行的移除不止 2 次,那么您的集合可能会非常大。

如果重复没问题,代码就更简单了:

orig = '288/24x6=18x13x8'
print(orig)

for outer_pos1 in range(len(orig)):
    for pos2 in range(len(orig)):
        # avoid overwriting outer loop variable for next inner iter.
        pos1 = outer_pos1
        if pos1 == pos2:
            continue
        if pos1 > pos2:
            pos1,pos2 = pos2,pos1
        new_string = orig[:pos1] + orig[pos1+1:pos2] + orig[pos2+1:]
        print(new_string)

pos1pos2 的交换是为了使顺序增加并且切片将正确运行。

【讨论】:

实际上,我的 pos1pos2 的交换/排序似乎有问题,但我终生无法弄清楚原因 由于某种原因,pos1 在交换后始终为 0,除非我更改外部循环变量的名称并在内部循环中分配 pos1 = outer,然后它可以工作:for weird in range(len(orig)): for pos2 in range(len(orig)): pos1 = weird 哦,所有有效的方程式都比所有字符串都更难删除 2 个字符——尽管这可能应该在问题中明确说明。 (顺便说一句:我发现了我在第一条评论中提到的代码问题,我正在覆盖外部循环变量,当然它不会在下一次内部迭代中重新定义)。 非常感谢 :)【参考方案2】:

希望对你有所帮助,使用两个循环同时删除2个字符,

S = "288/24x6=18x13x8"

for i in range(len(S)):
  for j in range(len(S)-1):
     A=list(S)
     if i != j:
       A[i]="#"  
       A[j]="#"
       A="".join(A)
       print("Before:  " + A + "   After remove:  " + A.replace("#",""))

[输出]

Before:  ##8/24x6=18x13x8   After remove:  8/24x6=18x13x8
Before:  #8#/24x6=18x13x8   After remove:  8/24x6=18x13x8
Before:  #88#24x6=18x13x8   After remove:  8824x6=18x13x8
Before:  #88/#4x6=18x13x8   After remove:  88/4x6=18x13x8
Before:  #88/2#x6=18x13x8   After remove:  88/2x6=18x13x8
Before:  #88/24#6=18x13x8   After remove:  88/246=18x13x8
Before:  #88/24x#=18x13x8   After remove:  88/24x=18x13x8
Before:  #88/24x6#18x13x8   After remove:  88/24x618x13x8
Before:  #88/24x6=#8x13x8   After remove:  88/24x6=8x13x8
Before:  #88/24x6=1#x13x8   After remove:  88/24x6=1x13x8
Before:  #88/24x6=18#13x8   After remove:  88/24x6=1813x8
Before:  #88/24x6=18x#3x8   After remove:  88/24x6=18x3x8

【讨论】:

以上是关于如何生成这些子字符串? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Java 如何存储字符串以及子字符串如何在内部工作? [关闭]

如何在Bash中提取多个唯一子字符串

如何通过在 Windows 中使用批处理替换子字符串来重命名文件 [关闭]

在不使用内置函数的情况下生成随机数 [关闭]

C字符串处理函数来获取子字符串[关闭]

惯用的Scala迭代所有子字符串[关闭]