LeetCode03--最长前缀和有用的括号

博客主要讲解两个问题。一是最长前缀问题,需用indexOf和substring函数,通过循环比较和缩字符找公共最长前缀;二是有用的括号问题,利用栈结构和map集合,根据括号对应关系入栈出栈判断,最终栈为空则字符串括号有效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值