zoukankan      html  css  js  c++  java
  • 14.最长公共前缀

    题目:

    编写一个函数来查找字符串数组中的最长公共前缀。

    如果不存在公共前缀,返回空字符串 ""

    示例 1:

    输入: ["flower","flow","flight"]
    输出: "fl"
    

    示例 2:

    输入: ["dog","racecar","car"]
    输出: ""
    解释: 输入不存在公共前缀。
    

    解法:

    直觉解法:

    基本就是遍历对照。

    • 最长公共前缀的长度不会大于最短字符串的长度,所以先选出一个最短字符串,缩小问题规模。(但是其实没必要)
    • 遍历对应位置,如果所有字符串对应位置匹配则记录该位。
    • 最后输出n位相同字符。
    public class Solution {
        public string LongestCommonPrefix(string[] strs) {
            if(strs.Length == 0) return "";
            if(strs.Length == 1) return strs[0];
            // 选出一个最短的字符长度
            int len = strs[0].Length;
            for(int i = 0;i<strs.Length;i++)
            {
                if(strs[i].Length<len)
                    len = strs[i].Length;
            }
            // num保存最多有几个字符串对应位置相同,index保存最多有多少位相同
    
            int index = 0;
            // 遍历公共长度
            for(int i = 0;i<len;i++)
            {
                char target = strs[0][i];
                int num = 0;
                // 遍历所有字符串
                for(int j = 0;j<strs.Length;j++)
                {
                    // 检查不同字符串的对应位置
                    if(strs[j][i] == target)
                    {
                        num++;
                    }
                    else break;  
                }
                
                if(num<strs.Length)
                    break;
                else
                {
                    index++;
                }
            }
            string result = new string(strs[0].ToCharArray(),0,index);
            return result;
        }
    }
    

    官方题解

    最长公共子串(Java):
    public String longestCommonPrefix(String[] strs) {
        if (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;
    }
    
    水平扫描:

    比较对应列上的字符是否相同。

    分治:

    这个算法的思路来自于LCP操作的结合律。将原问题分成两个子问题,用子问题的解来比较构成原问题的解。

    二分查找:
  • 相关阅读:
    置换python2.7.13的opcode遇到的一些坑
    不思议迷宫:逆向后的放置play
    Vmware(vmdk)虚拟机到hyperv(vhd)虚拟机转换
    MJRefresh自定义刷新动画
    UIScrollView循环滚动1
    IOS开发中如何实现自动检测更新APP
    ios极光推送快速集成教程
    IOS中程序如何进行推送消息(本地推送,远程推送)2(上)
    IOS中程序如何进行推送消息(本地推送,远程推送)2(下)
    IOS中程序如何进行推送消息(本地推送,远程推送)
  • 原文地址:https://www.cnblogs.com/zhang-mo/p/10860704.html
Copyright © 2011-2022 走看看