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<E> 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<E> l = last;
final Node<E> 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