1.最长前缀
//编写一个函数来查找字符串数组中的最长公共前缀。 // // 如果不存在公共前缀,返回空字符串 ""。 // // 示例 1: // // 输入: ["flower","flow","flight"] //输出: "fl" // // // 示例 2: // // 输入: ["dog","racecar","car"] //输出: "" //解释: 输入不存在公共前缀。 // // // 说明: // // 所有输入只包含小写字母 a-z 。 // Related Topics 字符串
最长前缀的问题是一个考验对字符串处理函数熟练程度的题,其主要方法就是,假设有三个字符串,将其中第一个字符串设定为前缀,然后和后面的其他字符串依次进行比较,如果不是前缀,那么就往前缩一个字符,再进行比较,直到1、2号字符有了公共的最长前缀,然后再看看这个是不是3号字符串的前缀,如果不是继续往前缩,直到是3号的前缀,或者字符串变为" "为止。这其中最重要的两个函数分别是indexOf和substring,一个用于判断是否为前缀,一个用于分割字符串。
public String longestCommonPrefix(String[] strs) {
if(strs==null || strs.length==0){
return "";
}
String prefix = strs[0];
for (int i = 1; i < strs.length; i++) {
while(strs[i].indexOf(prefix) != 0){
prefix = prefix.substring(0, prefix.length() - 1);
}
//如果分完了,还是没有相同的前缀,那就返回""
if(prefix.isEmpty()){
return "";
}
}
return prefix;
}
可以看到for循环中有一个while,这里一定要用while,表示一直分,一直分,只带是str[i]的前缀为止,不能使用if。
2.有用的括号
//给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。 // // 有效字符串需满足: // // // 左括号必须用相同类型的右括号闭合。 // 左括号必须以正确的顺序闭合。 // // // 注意空字符串可被认为是有效字符串。 // // 示例 1: // // 输入: "()" //输出: true // // // 示例 2: // // 输入: "()[]{}" //输出: true // // // 示例 3: // // 输入: "(]" //输出: false // // // 示例 4: // // 输入: "([)]" //输出: false // // // 示例 5: // // 输入: "{[]}" //输出: true // Related Topics 栈 字符串
第二题考察的是栈的相关内容,而且体现了栈这种数据结构的优势,因为正确的字符串括号都是一一对应的,而且不能出现类似于'({)'这种情况,那么就要求只要我们出现了正括号,遇到的下一个反括号一定与之对应。所以这里先用map集合对正括号和反括号进行了存储,让键值对一一对应,键是反括号,值是正括号。一旦遇见了正括号我们就将其入栈,遇见了反括号我们就判断栈中第一个元素是不是与之对应的正括号,如果不是或者栈为空,直接返回false。如果是,那我们就将栈中对应的正括号出栈,再对下一对括号进行判断。当我们整个字符串判断完成之后,栈应该是空的,如果不是空的,也返回false。这样就实现了所有的功能。
public boolean isValid(String s) {
int length = s.length();
if(length % 2 == 1){
return false;
}
Map<Character, Character> map = new HashMap<Character, Character>();
map.put('}', '{');
map.put(']', '[');
map.put(')', '(');
LinkedList<Character> list = new LinkedList<Character>();
for (int i = 0; i < length; i++) {
char c = s.charAt(i);
//遇见反括号
if(map.containsKey(c)){
//查找之前是否有正括号被存入栈中,而且当前第一个是不是我反括号对应的正括号
//栈中全部是正括号
if(list.isEmpty() || list.peek()!=map.get(c)){
return false;
}
//出栈
list.pop();
}else {
list.push(c);
}
}
//判断最后正括号是否全部出栈
return list.isEmpty();
}