如何生成这些子字符串? [关闭]
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)
pos1
和 pos2
的交换是为了使顺序增加并且切片将正确运行。
【讨论】:
实际上,我的pos1
和 pos2
的交换/排序似乎有问题,但我终生无法弄清楚原因
由于某种原因,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 如何存储字符串以及子字符串如何在内部工作? [关闭]