将第一个字符串依次和之后的每一个字符串相比较,并返回最长公共前缀
public class GongGongQianZhui { public static void main(String[] args) { String []ss = {"flower","floor","flow","floller"}; String s = longCommonPrefix(ss); System.out.println(s); } public static String longCommonPrefix(String s1,String s2){ int length = Math.min(s1.length(),s2.length()); // 取s1和s2字符串长度最小值,按最小长度来看 int index = 0; // 定义一个指针下标,最开始指向第一个字符,代表第一个字符的下标 // 当下标值小于最小字符串的长度 且 第一个字符串和第二个字符串同时第某个位置的字符是相同的 while (index < length && s1.charAt(index) == s2.charAt(index)) { index++; // 字符下标后移 } return s1.substring(0,index); // 截取任意一个字符串从0开始到index前一个值间的所有字符,(substring前闭后开) } public static String longCommonPrefix(String []s){ if (s == null || s.length == 0) { // 如果字符串数组里什么都没有或者字符串数组是空的 return ""; // 返回空字符串无最长公共前缀 } String prefix = s[0]; // 取第一个字符串 for (int i=1;i<s.length;i++){ // 从第二个字符串开始遍历 prefix = longCommonPrefix(prefix,s[i]); // 将第一个字符串和第二(三四五..剩余字符串)依次比较,返回公共前缀 if (prefix.length() == 0) { // 如果公共前缀是0,直接退出循环 break; } } return prefix; // 返回最长公共前缀 } }利用栈的先进后出规则,匹配则将栈顶括号弹出,最后只需判断栈是否为空就得知是否是有效的括号组合。
import java.util.Deque; import java.util.HashMap; import java.util.LinkedList; public class KuoHaoPanDuan { public static void main(String[] args) { String a = "[{()}]"; boolean valid = isValid(a); System.out.println(valid); } public static boolean isValid(String s) { if (s.length() % 2 == 1) { // 字符串的长度如果为奇数,必缺失一个括号,({[})长度为5,必不合题 return false; } HashMap<Character, Character> hashmap = new HashMap<>(); // 创建哈希表 hashmap.put(')','('); // 键key为右括号,值value为左括号 hashmap.put('}','{'); hashmap.put(']','['); Deque<Character> stack = new LinkedList<>(); // 创建链表 for (int i=0; i<s.length(); i++){ char ch = s.charAt(i); // 从字符串的第一个字符开始取 if (hashmap.containsKey(ch)) { // 哈希表中存在提供的字符串的某一个字符 if (stack.isEmpty() || stack.peek() != hashmap.get(ch)) { // 如果栈为空或者在栈顶的值不为哈希表中键ch对应的左括号 return false; } stack.pop(); // 栈弹出括号 }else { stack.push(ch); // 推入数据 } } return stack.isEmpty(); // 返回栈是否为空 } }