17题:电话号码的字母组合(Golang)

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/思路是构建一棵树或者DFS。我假想了树的形式,预先申请了叶子节点数量的字符串数组,然后构建下标表达式,将结果放到相应的位置。可惜做题的时候跳了好多个坑,干的活又累又久:range遍历方法返回的第二个值,就仅仅是.
摘要由CSDN通过智能技术生成

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/在这里插入图片描述

思路是构建一棵树或者DFS。

在这里插入图片描述

我假想了树的形式,预先申请了叶子节点数量的字符串数组,然后构建下标表达式,将结果放到相应的位置。
可惜做题的时候跳了好多个坑,干的活又累又久:

  1. range遍历方法返回的第二个值,就仅仅是而已,对它直接修改不会对字符串有任何改变。
  2. append第一个操作数是切片,不能对字符串直接操作(正确做法应该是对[]byte操作),不像c++里的push_back。
  3. 使用函数修改字符串,当然得传地址进函数。
  4. ReplaceAll(字符串的大多数操作)有返回值,干调用没有结果,需要赋值行为改变值。
  5. golang字符串拼接会产生很多个子串拷贝,对内存而言这样的代码不太健康,不知道有什么更好的方法
import "strings"

func appendStr(str *[]string, numstr string, plen int) int {
	var left, right, cnt int
	for j := 1; j <= plen; j++ {
		left = (j - 1) * len(*str) / plen
		right = j * len(*str) / plen
		for i := 0; i < right-left; i++ {
			cnt = (right - left) / len(numstr)
			(*str)[left+i] = strings.ReplaceAll((*str)[left+i], (*str)[left+i], (*str)[left+i]+numstr[i/cnt:i/cnt+1])
		}
	}
	return plen * len(numstr)
}

func letterCombinations(digits string) []string {
	vlen := 1
	for _, v := range digits {
		if v == '7' || v == '9' {
			vlen *= 4
		} else if v != '*' && v!= '#' && v!='1' {
			vlen *= 3
		}
	}
    if vlen == 1{
        vlen = 0
    }
	restr := make([]string, vlen)
	vlen = 1
	for _, v := range digits {
		switch v {
		case '2': vlen = appendStr(&restr, "abc", vlen)
		case '3': vlen = appendStr(&restr, "def", vlen)
		case '4': vlen = appendStr(&restr, "ghi", vlen)
		case '5': vlen = appendStr(&restr, "jkl", vlen)
		case '6': vlen = appendStr(&restr, "mno", vlen)
		case '7': vlen = appendStr(&restr, "pqrs", vlen)
		case '8': vlen = appendStr(&restr, "tuv", vlen)
		case '9': vlen = appendStr(&restr, "wxyz", vlen)
		}
	}
	return restr
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值