14 Longest Common Prefix
2015-08-22 18:54
260 查看
题目链接:https://leetcode.com/problems/longest-common-prefix/
题目:
解题思路:
最初的想法:
先比较前两个字符串,得出一个公共前缀。由于之后字符串的公共前缀只可能在此基础上进行缩减,所以就以第一个公共前缀和剩余字符串比较,当比较到不同时,就对公共前缀进行缩减。如果公共前缀的长度缩减到小于 0 ,则 “”空字符串是它们的公共前缀。
这种思路要注意的细节比较多。比如,需随时关注公共前缀的末尾下标是否越界(包括向前越界和向后越界)
第二种思路是网上看到的。
这种思路包含两个循环。第一个循环在字符串数组中找出最短的字符串。以这个字符串的长度为比较极限(最长公共前缀不会超过最小字符串的长度),开启第二个循环。第二个循环依次比较每一个字符串的第 i 个字符是否相等。即,每一次循环把所有字符串的第 i 位进行比较。
注意:
第一种方法用到了 StringBuffer 的
deleteCharAt(int index)
Removes the char at the specified position in this sequence.
方法,这是之前没有接触过的 API,偶然发现记录一下。
第一种:
第二种:
题目:
Write a function to find the longest common prefix string amongst an array of strings.
解题思路:
最初的想法:
先比较前两个字符串,得出一个公共前缀。由于之后字符串的公共前缀只可能在此基础上进行缩减,所以就以第一个公共前缀和剩余字符串比较,当比较到不同时,就对公共前缀进行缩减。如果公共前缀的长度缩减到小于 0 ,则 “”空字符串是它们的公共前缀。
这种思路要注意的细节比较多。比如,需随时关注公共前缀的末尾下标是否越界(包括向前越界和向后越界)
第二种思路是网上看到的。
这种思路包含两个循环。第一个循环在字符串数组中找出最短的字符串。以这个字符串的长度为比较极限(最长公共前缀不会超过最小字符串的长度),开启第二个循环。第二个循环依次比较每一个字符串的第 i 个字符是否相等。即,每一次循环把所有字符串的第 i 位进行比较。
注意:
第一种方法用到了 StringBuffer 的
deleteCharAt(int index)
Removes the char at the specified position in this sequence.
方法,这是之前没有接触过的 API,偶然发现记录一下。
第一种:
public class Solution { public String longestCommonPrefix(String[] strs) { if(strs == null || strs.length == 0) return ""; if(strs.length == 1) return strs[0]; int end = 0; while(end < strs[0].length() && end < strs[1].length()) { if(strs[0].charAt(end) != strs[1].charAt(end)) break; else end ++; } StringBuffer prefix = new StringBuffer(); if(!strs[0].equals("") && !strs[1].equals("")) { end --; prefix.append(strs[0].substring(0, end + 1)); } else { return ""; } for(int i = 2; i < strs.length; i ++) { while(!strs[i].startsWith(prefix.toString()) && end >= 0) { prefix.deleteCharAt(end); end --; } if(end < 0) break; } return prefix.toString(); } }
117 / 117 test cases passed. Status: Accepted Runtime: 312 ms
第二种:
public class Solution { public String longestCommonPrefix(String[] strs) { if(strs == null || strs.length == 0) return ""; int minLen=Integer.MAX_VALUE; for(String str: strs){ if(minLen > str.length()) minLen = str.length(); } if(minLen == 0) return ""; for(int j=0; j<minLen; j++){ char prev='0'; for(int i=0; i<strs.length ;i++){ if(i==0) { prev = strs[i].charAt(j); continue; } if(strs[i].charAt(j) != prev){ return strs[i].substring(0, j); } } } return strs[0].substring(0,minLen); } }
117 / 117 test cases passed. Status: Accepted Runtime: 320 ms
相关文章推荐
- android-反编译后重新打包apk文件
- linux命令
- Binary Tree Paths
- asp.net MVC helper 和自定义函数@functions小结
- Go语言的RPC介绍(含Protobuf-RPC)
- lua基金会【五岁以下儿童】I/O文件操作
- mac基础终端命令入门
- 学习计划
- Android驱动之 Linux Input子系统之TP——A/B(Slot)协议
- 黑马程序员_集合-List实现类、泛型笔记
- 2.确定字符互异
- bzoj4033
- IOS-笔记12(ScrollView)
- 栈-----------链表实现
- iOS开发 -- UISegmentedControl
- SSH试题
- UVa 11300 - Spreading the Wealth
- 我的centos 软件源
- UIViewController
- iOS开发 -- imageView (动画) UISlider进度条(滑块)