網站首頁 編程語言 正文
python亂序字符串排序
什么是亂序字符串排序
亂序字符串排序是指一個字符串是另一個字符串的亂序排序,比如apple就是eppal的亂序字符串。
檢查
假設字符串由26個小寫字符串組成。
1、時間復雜度O(n^2)
解決方案:
判斷兩個字符串長度是否相等,若不相等返回False,不相等則判斷第一個字符串的字符是否在第二個字符串中,如果不在,返回False,如果在則把第二個字符串中查找的位置元素置為None,因為要改變第二個字符串,需把第二個字符串轉換為list,代碼如下:
def none_sort_str(s1, s2):
? ? s2_list = list(s2)
? ? if len(s1) != len(s2):
? ? ? ? return False
? ? else:
? ? ? ? for i in range(len(s1)):
? ? ? ? ? ? for j in range(len(s2_list)):
? ? ? ? ? ? ? ? if s1[i] in s2_list:
? ? ? ? ? ? ? ? ? ? s2_list[s2_list.index(s1[i])] = None
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? return False
? ? return True
2、時間復雜度O(n)
解決方案:
判斷兩個字符串長度是否相等,若不相等返回False,使用計數方式,代碼如下:
def none_sort_str2(s1, s2):
? ? a = [0] * 26
? ? b = [0] * 26
? ? for i in range(len(s1)):
? ? ? ? index1 = ord(s1[i]) - ord('a')
? ? ? ? a[index1] += 1
? ? for i in range(len(s2)):
? ? ? ? index2 = ord(s2[i]) - ord('a')
? ? ? ? b[index2] += 1
? ? if a == b:
? ? ? ? return True
? ? else:
? ? ? ? return False
亂序字符串檢查算法研究?
顯示不同量級的算法的一個很好的例子是字符串的亂序檢查。亂序字符串是指一個字符串只是另一個字符串的重新排列。
例如,'heart' 和 'earth' 就是亂序字符串。'python' 和 'typhon' 也是。為了簡單起見,我們假設所討論的兩個字符串具有相等的長度,并且他們由 26 個小寫字母集合組成。我們的目標是寫一個布爾函數,它將兩個字符串做參數并返回它們是不是亂序。
解法一
思路:將兩個字符串都轉化成列表,然后遍歷其中一個,當前元素在另外一個列表中就把另一個列表的對應元素移除(防止重復干擾)。不存在就返回FALSE,遍歷完成返回True
代碼參考如下:
str1 = 'hagjen'
str2 = 'ahejng'
def foo(str1,str2):
? ? ls1 = list(str1)
? ? ls2 = list(str2)
? ? for i in ls1:
? ? ? ? if i in ls2:
? ? ? ? ? ? ls2.remove(i)
? ? ? ? else:return False
? ? return True
print(foo(str1,str2))
算法復雜度:兩層for循環,都是和n線性相關,所以這個算法復雜度為 O(n^2 )。
解法二
兩個字符串也都轉為列表,然后排序當排序后連個列表相等就返回True,否則FALSE
str1 = 'hagjen'
str2 = 'ahejng'
def foo(str1,str2):
? ? ls1 = list(str1).sort()
? ? ls2 = list(str2) .sort()
? ? return True if ls1==ls2 else False
print(foo(str1,str2))
算法復雜度:咋一看完全沒有循環,復雜度好像非常低,但是別忘了排序!排序是python內部實現的,它也需要時間消耗,排序的算法復雜度一般是O(nlog(n)),O(n^2)。所以這種方法不一定比上面的好
解法三
建立兩個長度為26的列表,分別遍歷兩個字符串,分別計數,最后兩個列表相同就返回True
def foo(s1,s2):
? ? ls1 = list(s1)
? ? ls2 = list(s2)
? ? count1 = [0 for ?i in range(26)]
? ? count2 = [0 for ?i in range(26)]
? ? print(count1)
? ? print(count2)
? ? for ?i in ls1:
? ? ? ? count1[ord(i)-ord('a')] +=1
? ? for ?i in ls2:
? ? ? ? count2[ord(i)-ord('a')] +=1
? ? return True if count1==count2 else False
print(foo('aacf','cfaa'))
時間復雜度:由于沒有循環嵌套也沒有排序等算法,時間復雜度為2n+26,即O(n)
代碼優化:
def is_simlar(s1, s2):
? ? from collections import Counter
? ? return Counter(s1) == Counter(s2)
原文鏈接:https://blog.csdn.net/qq_36255988/article/details/88290282
相關推薦
- 2022-03-16 Android線程池源碼閱讀記錄介紹_Android
- 2022-08-04 Go?slice切片使用示例詳解_Golang
- 2022-12-28 Android?ViewPager2?+?Fragment?聯動效果的實現思路_Android
- 2023-03-19 Android全面屏適配與判斷超詳細講解_Android
- 2022-08-06 Android?無障礙全局懸浮窗實現示例_Android
- 2022-07-14 python中序列的逆序方式_python
- 2022-06-21 C++簡明分析臨時對象是什么_C 語言
- 2023-12-22 獲取微信小程序版本號,uni
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支