查找字符串的所有大写、小写和混合大小写组合
- 2025-04-10 09:45:00
- admin 原创
- 13
问题描述:
我想编写一个程序,它接受一个字符串,比如说"Fox"
,然后它会显示:
fox, Fox, fOx, foX, FOx, FoX, fOX, FOX
我迄今为止的代码:
string = raw_input("Enter String: ")
length = len(string)
for i in range(0, length):
for j in range(0, length):
if i == j:
x = string.replace(string[i], string[i].upper())
print x
目前输出:
Enter String: fox
Fox
fOx
foX
>>>
解决方案 1:
import itertools
s = 'Fox'
map(''.join, itertools.product(*zip(s.upper(), s.lower())))
>>> ['FOX', 'FOx', 'FoX', 'Fox', 'fOX', 'fOx', 'foX', 'fox']
解决方案 2:
我一直想尝试一下这个。
不知道这是否符合您的资格(但它确实有效)。
str = raw_input()
def getBit(num, bit):
return (num & 1 << bit) != 0
for i in xrange(0,2**len(str)):
out = ""
for bit in xrange(0,len(str)):
if getBit(i,bit):
out += str[bit].upper()
else:
out += str[bit].lower()
print(out)
这个想法是,当你以二进制增加时,你会得到 1 和 0 的所有可能的排列。
然后,只需将这个 1 和 0 的列表转换为字符串,1 表示大写,0 表示小写。
解决方案 3:
这是@ephemient 稍加修改后得出的非常好的、被接受的答案。
变化:
先小写后大写,这样列表就以“fox”开头,而不是“FOX”(问题的示例序列以“fox”开头)
使用列表推导式代替
map()
(实际上两种方式都可以)分解生成大小写字母对的代码,使其更加清晰
将其打包成一个函数。
代码:
import itertools as it
def cap_permutations(s):
lu_sequence = ((c.lower(), c.upper()) for c in s)
return [''.join(x) for x in it.product(*lu_sequence)]
解决方案 4:
使用列表推导的一行代码:
from itertools import permutations
strs='fox'
combin=[''.join(x) for x in permutations(list(strs)+list(strs.upper()),3) if ''.join(x).lower()=='fox']
print(combin)
>>> ['fox', 'foX', 'fOx', 'fOX', 'Fox', 'FoX', 'FOx', 'FOX']
使用 for 循环:
from itertools import permutations
strs='fox'
lis2=list(strs)+list(strs.upper())
for x in permutations(lis2,3):
if ''.join(x).lower()=='fox':
print(''.join(x))
>>> fox
foX
fOx
fOX
Fox
FoX
FOx
FOX
解决方案 5:
使用乘积(False,True)查找字符串中大小变化字符的任何排列:
def capitalize_char_permutation (string:str) -> str :
conditions = product((0,1), repeat=len(string))
for i in conditions:
result = ''
for j in range(len(i)):
if i[j]==0 :
result+= string[j].lower()
else:
result+= string[j].upper()
yield result
解决方案 6:
我结合了@ephemient 的解决方案、@steveha 的解决方案和我自己的调整。
def allcasecombinations(s):
return list({''.join(x) for x in itertools.product(*zip(s.upper(), s.lower()))})
我的改进是使用集合,然后将其转换为列表。集合用于删除重复项:例如,如果您的字符串有标点符号,则原始函数将有重复项(因为" ".upper() == " ".lower()
)。我结合了@steveha的工作,因为我认为在集合中使用列表理解比更干净list(set(map(itertoolsmagic)))
。列表转换对于大多数用例来说可能不是必需的,但我添加了它以确保安全。
>>> allcasecombinations("hi!")
['HI!', 'hI!', 'Hi!', 'hi!']
解决方案 7:
虽然我尝试的是 C++,但我想你会明白其中的逻辑。我也被同样的问题难住了,所以我四处搜索,最后写了这个……我知道它并不完美,如果有人能帮助我改进这段代码并指出我的错误,我会非常高兴。
#include <bits/stdc++.h>
using namespace std;
string decToBinary(int n,int l)
{
string ret="";
for (int i = l-1; i >= 0; i--) {
int k = n >> i;
if (k & 1)
ret=ret+"1";
else
ret=ret+"0";
}
return ret;
}
int main()
{
string x;
cin>>x;
transform(x.begin(), x.end(), x.begin(), ::tolower);
int size=x.length();
string bin;
for(int i=0;i<pow(2,size);i++)
{
bin=decToBinary(i,size);
for(int j=0;j<size;j++)
{
if(bin[j]=='1')
cout<<(char)(x[j]-32);
else
cout<<x[j];
}
cout<<endl;
}
}
假设单词“dog”...那么,将有 2^(字母数),即 2^3=8 种组合。因此,在这个程序中,我们从 0-7 进行迭代,并将迭代器(在本例中为 i)转换为二进制,例如,进行第五次迭代,二进制将是 101,那么结果单词将是 DoG(将 1 视为大写,将 0 视为小写)...这样,您就可以获得所有 2^n 个结果单词。
扫码咨询,免费领取项目管理大礼包!