Golang每日一练(leetDay0071) 同构字符串、反转链表

简介: Golang每日一练(leetDay0071) 同构字符串、反转链表

205. 同构字符串 Isomorphic Strings


给定两个字符串 st ,判断它们是否是同构的。


如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。


每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。


示例 1:

输入:s = "egg", t = "add"

输出:true


示例 2:

输入:s = "foo", t = "bar"

输出:false


示例 3:

输入:s = "paper", t = "title"

输出:true


提示:

   1 <= s.length <= 5 * 10^4

   t.length == s.length

   s 和 t 由任意有效的 ASCII 字符组成


代码:三种方法,分别用哈希表、数组、字符串函数实现


package main
import (
  "fmt"
  "strings"
)
func isIsomorphic(s string, t string) bool {
  if len(s) != len(t) {
    return false
  }
  sMap := make(map[byte]byte) // 字符映射表,用于保存每个字符的映射
  tMap := make(map[byte]bool) // 标记表,用于记录每个字符是否已经有映射
  for i := 0; i < len(s); i++ {
    if val, ok := sMap[s[i]]; ok { // 如果s[i]已经有映射,则检查其是否符合要求
      if val != t[i] {
        return false
      }
    } else { // 如果s[i]没有映射,则添加映射
      if tMap[t[i]] { // 如果t[i]已经有了映射,则说明不符合要求
        return false
      }
      sMap[s[i]] = t[i]
      tMap[t[i]] = true
    }
  }
  return true
}
func isIsomorphic2(s string, t string) bool {
  if len(s) != len(t) {
    return false
  }
  s2t := make([]byte, 256) // 用数组保存映射关系
  t2s := make([]byte, 256) // 用数组保存映射关系
  for i := 0; i < len(s); i++ {
    if s2t[s[i]] != 0 && s2t[s[i]] != t[i] || t2s[t[i]] != 0 && t2s[t[i]] != s[i] {
      return false
    }
    s2t[s[i]] = t[i]
    t2s[t[i]] = s[i]
  }
  return true
}
func isIsomorphic3(s string, t string) bool {
  for i := 0; i < len(s); i++ {
    if strings.IndexByte(s, s[i]) != strings.IndexByte(t, t[i]) {
      return false
    }
  }
  return true
}
func main() {
  s := "egg"
  t := "add"
  fmt.Println(isIsomorphic(s, t))
  fmt.Println(isIsomorphic2(s, t))
  fmt.Println(isIsomorphic3(s, t))
  s = "foo"
  t = "bar"
  fmt.Println(isIsomorphic(s, t))
  fmt.Println(isIsomorphic2(s, t))
  fmt.Println(isIsomorphic3(s, t))
  s = "paper"
  t = "title"
  fmt.Println(isIsomorphic(s, t))
  fmt.Println(isIsomorphic2(s, t))
  fmt.Println(isIsomorphic3(s, t))
}

输出:

true

true

true

false

false

false

true

true

true




206. 反转链表 Reverse Linked-list


给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。


示例 1:


418c9a63b355f5341f3961a706581d0a.jpeg




输入:head = [1,2,3,4,5]

输出:[5,4,3,2,1]


示例 2:

4ec027f344057b2d5483b94fdc619280.jpeg

输入:head = [1,2]

输出:[2,1]


示例 3:

输入:head = []

输出:[]


提示:

   链表中节点的数目范围是 [0, 5000]

   -5000 <= Node.val <= 5000

进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

代码:


package main
import "fmt"
// 链表节点的定义
type ListNode struct {
  Val  int
  Next *ListNode
}
// 遍历链表
func (head *ListNode) print() {
  for head != nil {
    fmt.Printf("%d->", head.Val)
    head = head.Next
  }
  fmt.Println("<nil>")
}
// 创建链表
func create(arr []int) *ListNode {
  if len(arr) == 0 {
    return nil
  }
  head := &ListNode{Val: arr[0]}
  cur := head
  for i := 1; i < len(arr); i++ {
    node := &ListNode{Val: arr[i]}
    cur.Next = node
    cur = cur.Next
  }
  return head
}
func reverseList(head *ListNode) *ListNode {
  var prev, next *ListNode
  for head != nil {
    next = head.Next
    head.Next = prev
    prev = head
    head = next
  }
  return prev
}
func main() {
  arr1 := []int{1, 2, 3, 4, 5}
  head1 := create(arr1)
  head1.print()
  head11 := reverseList(head1)
  head11.print()
  arr2 := []int{1, 2}
  head2 := create(arr2)
  head2.print()
  head2 = reverseList(head2)
  head2.print()
}


输出:

1->2->3->4->5-><nil>

5->4->3->2->1-><nil>

1->2-><nil>

2->1-><nil>

目录
相关文章
|
4月前
|
Go
Golang语言基本数据类型默认值及字符串之间互相转换案例
这篇文章讲解了Golang语言中基本数据类型的默认值、类型转换的概述以及整型、浮点型、字符串之间的相互转换案例,包括如何将基本数据类型转换为字符串类型和字符串类型转换为基本数据类型,以及字符串与字节切片之间的转换。
36 2
|
4月前
|
Go
Golang语言基础数据类型之字符串常用的操作
这篇文章介绍了Golang语言中字符串的定义、常用操作,包括字符串长度查看、遍历、类型转换、子串统计、比较、查找位置、替换、切割、大小写转换、剔除字符、前缀后缀判断、拼接、子串包含判断以及字符串join操作,同时提供了官方文档的查看方法。
40 1
|
5月前
|
Go
[golang]字符串拼接
[golang]字符串拼接
|
5月前
|
存储 程序员 编译器
Golang 中的字符串:常见错误和最佳实践
Golang 中的字符串:常见错误和最佳实践
|
5月前
|
Go 开发者
|
7月前
|
Go
【golang】golang 字符串切片排序
【golang】golang 字符串切片排序
76 1
|
7月前
|
Go
【golang】Go 判断字符串是否包含指定字符
【golang】Go 判断字符串是否包含指定字符
101 1
|
8月前
|
存储 Go 开发者
Golang深入浅出之-Go语言字符串操作:常见函数与面试示例
【4月更文挑战第20天】Go语言字符串是不可变的字节序列,采用UTF-8编码。本文介绍了字符串基础,如拼接(`+`或`fmt.Sprintf()`)、长度与索引、切片、查找与替换(`strings`包)以及转换与修剪。常见问题包括字符串不可变性、UTF-8编码处理、切片与容量以及查找与替换的边界条件。通过理解和实践这些函数及注意事项,能提升Go语言编程能力。
225 0
|
8月前
|
Go
Golang拼接字符串性能对比
【2月更文挑战第8天】Golang拼接字符串性能对比
86 2
|
8月前
|
Shell Linux 算法
Shell编程——弱数据类型的脚本语言快速入门指南
Shell编程——弱数据类型的脚本语言快速入门指南
97 0
Shell编程——弱数据类型的脚本语言快速入门指南