1:字符串的循环左移
给定一个字符串s[0..........N-1],要求把S的前k个字符移动到S的尾部,如把字符串"abcdef"前面的2个字符'a','b'移动到字符串的尾部得到'cdefab',即左移k
循环左移k=循环右移n-k
核心公式:XY to YX
(X'Y')'=YX
def stringLeftReverse(s,n,k):
s=[i for i in s] #转化为列表
s=transportation(s,0,k-1) #X'
s=transportation(s,k,n-1) #Y'
s=transportation(s,0,n-1) #(X'Y')'
s=''.join(s) #将字符串列表转化为字符串
return s
#转置函数
def transportation(s,left,right): #字符串子序列的转置
while left<right:
#首尾交换
s[right],s[left]=s[left],s[right]#这样的操作只能是可变的序列,像字符串这样的不可修改,需要将字符串转化为列表操作,之后转化为字符串
#指针移动
left+=1
right-=1
return s #返回字符串本身
if __name__=='__main__':
s='asdfeg'
n=len(s)
k=2
print(stringLeftReverse(s,n,k))
2:字符串的全排列
给定字符串s[0....N-1],设计算法,枚举字符串的全排列
eg:1234,
1---234全排列
2---134全排列
3---124全排列
4---123全排列
由上述可知这是一个递归问题。
(1)递归法---字符串的全排列:
def arrangementString(s,left,right):
if left==right:
print(''.join(s)) #将列表转化为字符串
for i in range(left,right+1): #left为当前递归序列的左边界,right为右边界
#i表示与当前递归序列首元素left要交换的元素
if isRepeat(s,left,i): #判断是否有重复字符 ,(left,i)注意这里要查询的范围
continue
s[i],s[left]=s[left],s[i]
arrangementString(s,left+1,right) #递归全排列
s[i],s[left]=s[left],s[i]
def isRepeat(s,left,right): #注意
flag=False
for i in range(left,right):
if s[i]==s[right]:
flag=True
break
return flag
if __name__=='__main__':
s='ABA'
s=[i for i in s] #将字符串转化为列表
left=0
right=len(s)-1
arrangementString(s,0,right)
(2)非递归法---字符串的全排列:
思路:先找出最小的;之后依次找出他的下一个比他大的排列。
问题化解为:下一个排列问题。
下一个排列问题:思路:从最末尾向前依次查找,当不满足升序停止。之后从停止位置向后查找,找出所有大于停止位置数值的元素,且找出最小的。之后交换停止位元素和最小元素。之后翻转,停止位之后的元素。
总结为:后找,大小,交换,反转。
def arrangementString(s,left,r