leetcode784字母大小写全排列

leetcode784


题目描述:

给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合

输入:

一个字符串

输出:

linkedList列表,包含输入字符串大小写全排序

思路(思路是看的网上一个大神的):

从最开始给定的字符串开始,放入list中,每次判断位置为i的是否是字符,如果是,先获取list中的size,对于list中的每一个字符串,把他们切分为两部分,i的左边和i的右边,分别将第i位的大写字符、小写字符和左边右边重新拼接形成新的字符串放入list表中,如此循环直到最后一个字符,这样得到的就是字符串大小写全排列

代码:

    public List<String> letterCasePermutation(String S) {
        LinkedList<String> res = new LinkedList<>();
        res.add(S);
        for (int i = 0; i < S.length(); i++) {
            char c = S.charAt(i);
            if (Character.isLetter(c)) {
                for (int j = res.size(); j>0; j--) {
                    String s = res.poll();
                    String left = s.substring(0, i);
                    String right = s.substring(i + 1);
                    res.add(left + Character.toLowerCase(c) + right);
                    res.add(left + Character.toUpperCase(c) + right);
                }
            }
        }
        System.out.println(res);
        return res;
    }

注意 在获取linkedList的size的时候一定要先获取准备的大小,再循环,就是写成 for (int j = res.size(); j>0; j--) {}的形式,不要写成for (int j = 0; j < res.size(); j++) {},因为后者在运行的过程中list列表的大小会发生变化,这样会陷入死循环,应该用第一种方法先获取size的大小再循环。

重点

LinkedList的poll方法

    public E poll() {
       final Node f = first;
       return (f == null) ? null : unlinkFirst(f);
   }

可以看见默认的是从开头取数据

而linkedList的add方法:

    public boolean add(E e) {
       linkLast(e);
       return true;
   }
   
   void linkLast(E e) {
       final Node l = last;
       final Node newNode = new Node<>(l, e, null);
       last = newNode;
       if (l == null)
           first = newNode;
       else
           l.next = newNode;
       size++;
       modCount++;
   }

可以看出是add到列表的最后,所以这样在循环取的过程中每次取的是头部的内容,插入是插入到尾部,不会造成数据重复改变。

zsjwish

2018年4月22日20:32:45

你可能感兴趣的:(leetcode)