赞
踩
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例1:
输入: ["flower","flow","flight"]
输出: "fl"
示例2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
看到题目后,首先要想到字符数组为空的情况,这时无需判断,直接返回" “就好。
还有一种情况也可以直接返回” ",当strs.length()==0时,也不用判断。
接着说下我们的大体思路:定义一个函数,传入字符数组的前两个字符串,使他返回两个字符串的公共部分(从索引值为0处开始),接着建立循环,将该串与字符数组的下一个字符串,进行共有部分判断(借助于刚定义的函数),如果返回出来的串的长度不为0,则直接将本串作为最终结果返回;如果该字符串长度为0,说明没有共有部分,返回" "。
定义一个返回共有部分的函数。
代码实现:
//定义函数,用来返回两个字符串中相同的部分
public static String AAA(String str1,String str2){
//代表索引值
int index = 0;
//取两个字符串中长度较小的那个当做循环条件,因为是按字符匹配,所有循环次数不能超过长度较小的子串的长度
int min = Math.min(str1.length(), str2.length());
//索引值合法时,并且两个串中相同索引的字符也相同,则移动索引值到下一个位置
while(index<min && str1.charAt(index)==str2.charAt(index)){
index++;
}
//返回两个字符串中相同的部分
return str1.substring(0,index);
}
具体算法思想,单独定义一个变量存储字符数组首元素,将他和字符数组下一个元素作为参数,传入自己定义的函数并获得共有部分,将共有部分和数组下一个值继续当参数传入函数,看是否能继续找到共有部分,找不到则返回空。
代码实现:
public static String longestCommonPrefix(String[] strs) { //如果字符数组为空,或者长度为0。直接返回空 if(strs ==null||strs.length==0){ return ""; } //记录数组长度 int length = strs.length; //定义sign存储第一个元素 String sign = strs[0]; for (int i = 0; i < length; i++) { //每次都用两个字符串中相同的部分去跟下一个字符串进行比较,并将他们的相同部分或取出来,在进行比较,知道循环结束 sign = AAA(sign, strs[i]); //如果相同部分的字符串长度为0,说明没有公共部分,直接跳出循环 if(sign.length()==0){ break; } } return sign; }
package Demo06;/* *@Author: *@Date:2020/11/3 14:10 */ public class Test04 { public static void main(String[] args) { String[] s = {"cir","car"}; // String[] s = {}; String s1 = longestCommonPrefix(s); System.out.println(s1); } public static String longestCommonPrefix(String[] strs) { //如果字符数组为空,或者长度为0。直接返回空 if(strs ==null||strs.length==0){ return ""; } //记录数组长度 int length = strs.length; //定义sign存储第一个元素 String sign = strs[0]; for (int i = 0; i < length; i++) { //每次都用两个字符串中相同的部分去跟下一个字符串进行比较,并将他们的相同部分或取出来,在进行比较,知道循环结束 sign = AAA(sign, strs[i]); //如果相同部分的字符串长度为0,说明没有公共部分,直接跳出循环 if(sign.length()==0){ break; } } return sign; } //定义函数,用来返回两个字符串中相同的部分 public static String AAA(String str1,String str2){ //代表索引值 int index = 0; //取两个字符串中长度较小的那个当做循环条件,因为是按字符匹配,所有循环次数不能超过长度较小的子串的长度 int min = Math.min(str1.length(), str2.length()); //索引值合法时,并且两个串中相同索引的字符也相同,则移动索引值到下一个位置 while(index<min && str1.charAt(index)==str2.charAt(index)){ index++; } //返回两个字符串中相同的部分 return str1.substring(0,index); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。