经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
有效的字母异位词的golang实现
来源:cnblogs  作者:timliudream  时间:2018/12/17 9:44:40  对本文有异议

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词。

  1. 输入: s = "anagram", t = "nagaram"
  2. 输出: true
  3. 输入: s = "rat", t = "car"
  4. 输出: false

说明:

你可以假设字符串只包含小写字母

首先看到题目的意思就是说两个字符串的字母一样,只是位置可以不一样

而且说明也说了,只包含小写字母。

那我们可以通过对两个字符串里面的字符进行排序,如果排序后的两个字符串是一样的,那么就可以说这两个字符串是有效的

  1. // 比较两个排好序的字符串是不是一样
  2. func isAnagram(s string, t string) bool {
  3. var ss []string
  4. var ts []string
  5. for _, c := range s {
  6. ss = append(ss, string(c))
  7. }
  8. for _, c := range t {
  9. ts = append(ts, string(c))
  10. }
  11. sort.Strings(ss)
  12. sort.Strings(ts)
  13. return reflect.DeepEqual(ss, ts)
  14. // return stringSliceEqualBCE(ss, ts)
  15. }
  16. func stringSliceEqualBCE(a, b []string) bool {
  17. if len(a) != len(b) {
  18. return false
  19. }
  20. if (a == nil) != (b == nil) {
  21. return false
  22. }
  23. b = b[:len(a)]
  24. for i, v := range a {
  25. if v != b[i] {
  26. return false
  27. }
  28. }
  29. return true
  30. }

因为题目说了,字符串只包含小写字母,那我们就可以放心地对字符串进行foreach了

但是这个写法耗时非常严重。

  • 两个for,O(n)
  • 两个排序,O(Nlogn)
  • 乍看起来是一个O(Nlogn)的时间复杂度,但是几个加起来,时间就非常不乐观了

还有另外一种方法就是,使用map把字符串的字符出现个数保存起来

  1. // 用两个字典分别把两个字符串的字符出现个数保存起来
  2. func isAnagram1(s string, t string) bool {
  3. var sMap = make(map[rune]int)
  4. var tMap = make(map[rune]int)
  5. for _, c := range s {
  6. sMap[c] = sMap[c] + 1
  7. }
  8. for _, c := range t {
  9. tMap[c] = tMap[c] + 1
  10. }
  11. return reflect.DeepEqual(sMap, tMap)
  12. }

这个写法是一个O(N)时间复杂度的写法,时间比上面那个写法提升了不少

说明:

你可以假设字符串只包含小写字母

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号