Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.
 
Symbol 
Value 
 
 
I 
1 
 
V 
5 
 
X 
10 
 
L 
50 
 
C 
100 
 
D 
500 
 
M 
1000 
 
For example, two is written as II in Roman numeral, just two one’s added together. Twelve is written as, XII, which is simply X + II. The number twenty seven is written as XXVII, which is XX + V + II.
Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII. Instead, the number four is written as IV. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX. There are six instances where subtraction is used:
I can be placed before V (5) and X (10) to make 4 and 9. X can be placed before L (50) and C (100) to make 40 and 90. C can be placed before D (500) and M (1000) to make 400 and 900. Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999.
Example 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Example 1: Input: "III" Output: 3 Example 2: Input: "IV" Output: 4 Example 3: Input: "IX" Output: 9 Example 4: Input: "LVIII" Output: 58 Explanation: L = 50, V= 5, III = 3. Example 5: Input: "MCMXCIV" Output: 1994 Explanation: M = 1000, CM = 900, XC = 90 and IV = 4. 
 
JAVA题解 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 package  algorithm;import  java.util.HashMap;import  java.util.Map;public  class  Leetcode13   {    public  static  int  romanToInt (String s)   {         int [] moneys = new  int []{1000 , 900 , 500 , 400 , 100 , 90 , 50 , 40 , 10 , 9 , 5 , 4 , 1 };         String[] moneyToStr = new  String[]{"M" , "CM" , "D" , "CD" , "C" , "XC" , "L" , "XL" , "X" , "IX" , "V" , "IV" , "I" };         char [] chars = s.toCharArray();         int  result = 0 ;         int  tempJ = 0 ;         for  (int  i = 0 ; i < chars.length; ) {             for  (int  j = tempJ; j < moneyToStr.length; ) {                                  if  (new  String(new  char []{chars[i]}).equals(moneyToStr[j])) {                     result += moneys[j];                     i++;                                          tempJ = j;                     break ;                                      } else  if  (i + 1  < chars.length && new  String(new  char []{chars[i], chars[i + 1 ]}).equals(moneyToStr[j])) {                     result += moneys[j];                     i += 2 ;                                          tempJ = j + 1 ;                     break ;                 } else  {                     j++;                 }             }         }         return  result;     }     public  static  int  romanToInt1 (String s)   {         Map<String, Integer> map = new  HashMap<>();         map.put("I" , 1 );         map.put("IV" , 4 );         map.put("V" , 5 );         map.put("IX" , 9 );         map.put("X" , 10 );         map.put("XL" , 40 );         map.put("L" , 50 );         map.put("XC" , 90 );         map.put("C" , 100 );         map.put("CD" , 400 );         map.put("D" , 500 );         map.put("CM" , 900 );         map.put("M" , 1000 );         int  ans = 0 ;                  for (int  i = 0 ;i < s.length();) {                          if (i + 1  < s.length() && map.containsKey(s.substring(i, i+2 ))) {                 ans += map.get(s.substring(i, i+2 ));                                  i += 2 ;             } else  {                                  ans += map.get(s.substring(i, i+1 ));                                  i ++;             }         }         return  ans;     }     public  static  void  main (String[] args)   {         System.out.println(romanToInt("XIX" ));     } } 
 
Write a function to find the longest common prefix string amongst an array of strings.
If there is no common prefix, return an empty string “”.
Example 1 2 3 4 5 6 7 8 9 10 11 12 13 Example 1: Input: ["flower","flow","flight"] Output: "fl" Example 2: Input: ["dog","racecar","car"] Output: "" Explanation: There is no common prefix among the input strings. Note: All given inputs are in lowercase letters a-z. 
 
JAVA题解 水平扫描 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 package  algorithm;public  class  Leetcode14   {    public  static  String longestCommonPrefix (String[] strs)   {         if  (strs.length == 0 ) {             return  "" ;         }         if  (strs.length == 1 ) {             return  strs[0 ];         }         int  i = 0 ;         String pre = "" ;         for  (; i < strs[0 ].length(); i++) {             pre = strs[0 ].substring(0 , i + 1 );             int  j = 1 ;             boolean  end = false ;             for  (; j < strs.length; j++) {                 if  (!strs[j].startsWith(pre)) {                     break ;                 }                 if  (pre.length() == strs[j].length()) {                     end = true ;                 }             }             if  (j == strs.length && !end) {                 continue ;             } else  if  (j != strs.length) {                 if  (pre.length() > 1 ) {                     return  pre.substring(0 , pre.length() - 1 );                 } else  {                     return  "" ;                 }             } else  {                 return  pre;             }         }         return  pre;     }          public  static  String longestCommonPrefix1 (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;     }     public  static  void  main (String[] args)   {         System.out.println(longestCommonPrefix1(new  String[]{"flower" ,"fl" ,"flight" }));     }          public  static  String longestCommonPrefix2 (String[] strs)   {         if  (strs == null  || strs.length == 0 ) return  "" ;         for  (int  i = 0 ; i < strs[0 ].length() ; i++){             char  c = strs[0 ].charAt(i);             for  (int  j = 1 ; j < strs.length; j ++) {                                  if  (i == strs[j].length() || strs[j].charAt(i) != c)                     return  strs[0 ].substring(0 , i);             }         }                  return  strs[0 ];     } } 
 
分治算法 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 public  String longestCommonPrefix (String[] strs)   {    if  (strs == null  || strs.length == 0 ) return  "" ;             return  longestCommonPrefix(strs, 0  , strs.length - 1 ); } private  String longestCommonPrefix (String[] strs, int  l, int  r)   {  	     if  (l == r) {         return  strs[l];     }     else  {         int  mid = (l + r)/2 ;       	         String lcpLeft =   longestCommonPrefix(strs, l , mid);                  String lcpRight =  longestCommonPrefix(strs, mid + 1 ,r);       	         return  commonPrefix(lcpLeft, lcpRight);    } } String commonPrefix (String left,String right)   {    int  min = Math.min(left.length(), right.length());            for  (int  i = 0 ; i < min; i++) {       	         if  ( left.charAt(i) != right.charAt(i) )             return  left.substring(0 , i);     }     return  left.substring(0 , min); } 
 
二分查找法 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 public  String longestCommonPrefix (String[] strs)   {    if  (strs == null  || strs.length == 0 )         return  "" ;     int  minLen = Integer.MAX_VALUE;     for  (String str : strs)         minLen = Math.min(minLen, str.length());     int  low = 1 ;     int  high = minLen;     while  (low <= high) {         int  middle = (low + high) / 2 ;         if  (isCommonPrefix(strs, middle))             low = middle + 1 ;         else              high = middle - 1 ;     }     return  strs[0 ].substring(0 , (low + high) / 2 ); } private  boolean  isCommonPrefix (String[] strs, int  len)  {    String str1 = strs[0 ].substring(0 ,len);     for  (int  i = 1 ; i < strs.length; i++)         if  (!strs[i].startsWith(str1))             return  false ;     return  true ; } 
 
字典树 给定一些键值字符串 S = [S 1 ,S 2 …S n ],我们要找到字符串 q 与 S 的最长公共前缀。 这样的查询操作可能会非常频繁。
我们可以通过将所有的键值 S 存储到一颗字典树中来优化最长公共前缀查询操作。 如果你想学习更多关于字典树的内容,可以从 208. 实现 Trie (前缀树) 开始。在字典树中,从根向下的每一个节点都代表一些键值的公共前缀。 但是我们需要找到字符串q 和所有键值字符串的最长公共前缀。 这意味着我们需要从根找到一条最深的路径,满足以下条件:
这是所查询的字符串 q 的一个前缀
路径上的每一个节点都有且仅有一个孩子。 否则,找到的路径就不是所有字符串的公共前缀
路径不包含被标记成某一个键值字符串结尾的节点。 因为最长公共前缀不可能比某个字符串本身长
算法 
最后的问题就是如何找到字典树中满足上述所有要求的最深节点。 最有效的方法就是建立一颗包含字符串[S 1 …S n ] 的字典树。 然后在这颗树中匹配 q 的前缀。 我们从根节点遍历这颗字典树,直到因为不能满足某个条件而不能再遍历为止。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 public  String longestCommonPrefix (String q, String[] strs)   {    if  (strs == null  || strs.length == 0 )          return  "" ;       if  (strs.length == 1 )          return  strs[0 ];     Trie trie = new  Trie();           for  (int  i = 1 ; i < strs.length ; i++) {         trie.insert(strs[i]);     }     return  trie.searchLongestPrefix(q); } class  TrieNode   {         private  TrieNode[] links;     private  final  int  R = 26 ;     private  boolean  isEnd;          private  int  size;         public  void  put (char  ch, TrieNode node)   {         links[ch -'a' ] = node;         size++;     }     public  int  getLinks ()   {         return  size;     }           } public  class  Trie   {    private  TrieNode root;     public  Trie ()   {         root = new  TrieNode();     }     private  String searchLongestPrefix (String word)   {         TrieNode node = root;         StringBuilder prefix = new  StringBuilder();         for  (int  i = 0 ; i < word.length(); i++) {             char  curLetter = word.charAt(i);             if  (node.containsKey(curLetter) && (node.getLinks() == 1 ) && (!node.isEnd())) {                 prefix.append(curLetter);                 node = node.get(curLetter);             }             else                  return  prefix.toString();          }          return  prefix.toString();     } }