- List item
例 leetcode 49. 字母异位词分组
排序,hashmap分组,
public List<List<String>> groupAnagrams(String[] strs) {
ArrayList<List<String>> results = new ArrayList<List<String>>();
if(strs==null||strs.length==0)return results;
HashMap<String,List<String>>map = new HashMap<String,List<String>>();
for(int i =0;i<strs.length;i++){
char[]curr = strs[i].toCharArray();
Arrays.sort(curr);
String key = String.valueOf(curr);
if(!map.containsKey(key))
map.put(key,new ArrayList<String>());
map.get(key).add(strs[i]);
}
return new ArrayList<List<String>>(map.values());
}
例 leetcode 151 反转字符串里的单词
先反转字符串的每个单词
再反转字符串
这里要熟悉substring()不是大写。(左闭右开)。
还有stringbuffer的使用方法。与string的转换。
考虑到java字符串不可变,可能转换为数组操作更好一些。
另外还有栈的思路可以考虑配合字符数组。待实现。
public String reverseWords(String s) {
String res="";
for(int i=0;i<s.length();i++){
while(i<s.length()&&s.charAt(i)==' ')i++;
int j=i;
if(i==s.length())break;
while(j<s.length()&&s.charAt(j)!=' ')j++;
res=res+new StringBuffer(s.substring(i,j)).reverse().toString()+' ';
i=j;
}
if(res.length()==0)return "";
return new StringBuffer(res).reverse().toString().substring(1);
}
例 leetcode165 比较版本号
代码还可以用问号表达式简化。
public int compareVersion(String version1, String version2) {
String []array1= version1.split("\\.");
String []array2= version2.split("\\.");
int i=0,j=0;
while(i<array1.length&&j<array2.length){
int val1=Integer.parseInt(array1[i]);
int val2=Integer.parseInt(array2[j]);
if(val1>val2)return 1;
if(val1<val2)return -1;
i++;
j++;
}
if(i==array1.length&&j==array2.length)
return 0;
if(i==array1.length){
while(j<array2.length){
int val2=Integer.parseInt(array2[j]);
if(val2!=0)return -1;
j++;
}
return 0;
}
if(j==array2.length){
while(i<array1.length){
int val1=Integer.parseInt(array1[i]);
if(val1!=0)return 1;
i++;
}
return 0;
}
return 0;
}
例 leetcode5 最长回文子串
枚举的方法,枚举所有的中心点。
奇数中心点就是一个。
偶数中心点就是两个。
public String longestPalindrome(String s) {
String res="";
for(int i =0;i<s.length();i++){
for(int j=i,k=i;j>=0&&k<s.length()&&s.charAt(j)==s.charAt(k);j--,k++)
if(res.length()<k-j+1)
res=s.substring(j,k+1);
for(int j=i,k=i+1;j>=0&&k<s.length()&&s.charAt(j)==s.charAt(k);j--,k++)
if(res.length()<k-j+1)
res=s.substring(j,k+1);
}
return res;
}
例 leetcode 6 Z字形变换
C++代码
按顺序依次填入
string convert(string s, int numRows) {
if (numRows == 1) return s;
vector<string> rows(min(numRows, int(s.size())));
int curRow = 0;
bool goingDown = false;
for (char c : s) {
rows[curRow] += c;
if (curRow == 0 || curRow == numRows - 1) goingDown = !goingDown;
curRow += goingDown ? 1 : -1;
}
string ret;
for (string row : rows) ret += row;
return ret;
}
找规律也可以做
第一行等差数列
下面是两个交错的等差数列
最后是等差数列
例 leetcode 3 无重复的最长子串
HashMap可能更好。
public int lengthOfLongestSubstring(String s) {
Scanner input = new Scanner(System.in);
int ans=0;
Set<Character> charSet = new HashSet<>();
for(int i =0,j=0;j<s.length()&&i<s.length();){
if(!charSet.contains(s.charAt(j))){
charSet.add(s.charAt(j));
j++;
ans=Math.max(ans,j-i);
}
else{
charSet.remove(s.charAt(i++));
}
}
return ans;
}
例 leetcode 273 整数转英文表示
写起来有点麻烦
例 leetcode125. 验证回文串
可以通过阿斯克码判断,这里调用一下Character的函数,熟练一下。
public boolean isPalindrome(String s) {
char []array= s.toCharArray();
int j=0;
for(int i=0;i<array.length;i++)
if(Character.isDigit(array[i])||Character.isLetter(array[i])){
array[j]=array[i];
j++;
}
String s1=String.valueOf(array).substring(0,j).toLowerCase();
System.out.print(s1);
String s2 = new StringBuffer(s1).reverse().toString().toLowerCase();
return s1.equals(s2);
}
例 leetcode205 同构字符串
两次hash,对比。一次会出现一些情况搞不定
public boolean isIsomorphic(String s, String t) {
HashMap<Character,Character>map = new HashMap<>();
for(int i =0;i<s.length();i++){
if(map.containsKey(s.charAt(i))){
if(t.charAt(i)!=map.get(s.charAt(i)))
return false;
}else
map.put(s.charAt(i),t.charAt(i));
}
map.clear();
for(int i =0;i<s.length();i++){
if(map.containsKey(t.charAt(i))){
if(s.charAt(i)!=map.get(t.charAt(i)))
return false;
}else
map.put(t.charAt(i),s.charAt(i));
}
return true;
}
例 leetcode 290 单词规律
与上一题极其相似
public boolean wordPattern(String pattern, String str) {
HashMap<Character,String>map1 = new HashMap<>();
HashMap<String,Character>map2 = new HashMap<>();
String []array = str.split(" ");
if(array.length!=pattern.length())return false;
for(int i =0;i<pattern.length();i++){
if(map1.containsKey(pattern.charAt(i))){
if(!array[i].equals(map1.get(pattern.charAt(i))))
return false;
}else
map1.put(pattern.charAt(i),array[i]);
}
for(int i =0;i<pattern.length();i++){
if(map2.containsKey(array[i])){
if(pattern.charAt(i)!=map2.get(array[i]))
return false;
}else
map2.put(array[i],pattern.charAt(i));
}
return true;
}