美文网首页
【D24】反转字符串 & 电话号码的字母组合(LC 344&17

【D24】反转字符串 & 电话号码的字母组合(LC 344&17

作者: sirenyunpan | 来源:发表于2021-03-05 21:04 被阅读0次

    今日主题:字符串。

    344. 反转字符串

    问题描述

    编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

    解题思路

    让左指针指向第一个元素,右指针指向最后一个元素;交换两个元素的位置,然后让两个指针同时向内移动,直到两个指针相遇。

    代码实现

    class Solution {
        public void reverseString(char[] s) {
            int left = 0, right = s.length - 1;
            while(left < right){
                char temp = s[left];
                s[left] = s[right];
                s[right] = temp;
                left++;
                right--;
            }
        }
    }
    

    17. 电话号码的字母组合

    问题描述

    给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
    给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。


    电话按键

    解题思路

    看到排列问题,首先想到的就是回溯算法。
    路径:前 i - 1个数字组成的字符串对应的字母组合
    选择列表:第i个数字对应的字母列表
    结束条件:路径长度等于给出的数字字符串的长度
    做选择:从选择列表中拿出一个元素、将其加入路径

    代码实现

    class Solution {
    
        List<String> res = new ArrayList<>();
        HashMap<Character, String> choiceMap = new HashMap<>();
    
        public List<String> letterCombinations(String digits) {
            if(digits.length() == 0){
                return res;
            }
            addChoices();
            LinkedList<Character> track = new LinkedList<>();
            backtrack(track, digits, 0);
            return res;
           
        }
    
        //回溯更新结果
        public void backtrack(LinkedList<Character> track, String digits, int index){
            if(track.size() == digits.length()){
                res.add(list2str(track));
                return;
            }
    
            //获取选择列表
            String choices = choiceMap.get(digits.charAt(index));
            for(int i = 0; i < choices.length(); i++){
                track.add(choices.charAt(i));
                index++;
    
                backtrack(track, digits, index);
    
                track.removeLast();
                index--;
            }
        }
    
        private String list2str(LinkedList<Character> track){
            StringBuilder sb = new StringBuilder();
            for(Character c : track){
                sb.append(c);
            }
            //System.out.println(sb.toString());
            return sb.toString();
        }
    
        private void addChoices() {
            choiceMap.put('2', "abc");
            choiceMap.put('3', "def");
            choiceMap.put('4', "ghi");
            choiceMap.put('5', "jkl");
            choiceMap.put('6', "mno");
            choiceMap.put('7', "pqrs");
            choiceMap.put('8', "tuv");
            choiceMap.put('9', "wxyz");
        }
    }
    

    相关文章

      网友评论

          本文标题:【D24】反转字符串 & 电话号码的字母组合(LC 344&17

          本文链接:https://www.haomeiwen.com/subject/ymkdqltx.html