Java怎么使用指针进行搜索

59次阅读
没有评论

共计 3063 个字符,预计需要花费 8 分钟才能阅读完成。

这篇文章主要讲解了“Java 怎么使用指针进行搜索”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着丸趣 TV 小编的思路慢慢深入,一起来研究和学习“Java 怎么使用指针进行搜索”吧!

Given a string, find the length of the longest substring without repeating characters. 
Examples: 
Given  abcabcbb , the answer is  abc , which the length is 3. 
Given  bbbbb , the answer is  b , with the length of 1. 
Given  pwwkew , the answer is  wke , with the length of 3. Note that the answer must be 
 a substring; pwke  is a subsequence and not a substring.*
package com.lifeibigdata.algorithms.leetcode;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
 * Created by lifei on 16/5/27.
 *
 *  时间复杂度为 O(N) 的算法
  使用 i 和 j 两个指针进行搜索,i 代表候选的最长子串的开头,j 代表候选的最长子串的结尾。  先假设 i 不动,那么在理想的情况下,我们希望可以一直右移 j,直到 j 到达原字符串的结尾,此时 j - i 就构成了一个候选的最长子串。每次都维护一个 max_length,就可以选出最长子串了。  实际情况是,不一定可以一直右移 j,如果字符 j 已经重复出现过(假设 i 在位置 k),就需要停止右移了。记录当前的候选子串并和 max_length 做比较。接下来为下一次搜寻做准备。  在下一次搜寻中,i 应该更新到 k +1。这句话的意思是,用这个例子来理解,abcdef 是个不重复的子串,abcdefc 中(为了方便记录为 abc1defc2),c1 和 c2 重复了。  那么下一次搜寻,应该跨过出现重复的地方进行,否则找出来的候选串依然有重复字符,且长度还不如上次的搜索。所以下一次搜索,直接从 c1 的下一个字符 d 开始进行,  也就是说,下一次搜寻中,i 应该更新到 k +1
 */
public class LengthOfLongestSubstring { public static void main(String[] args) { LengthOfLongestSubstring lols = new LengthOfLongestSubstring();
 System.out.println(lols.lengthOfLongestSubstring( abcdefcgh));
 }
 public int lengthOfLongestSubstring(String s) { int n = s.length(), ans = 0;
 int[] index = new int[128]; // current index of character
 // try to extend the range [i, j]
 for (int j = 0, i = 0; j   n; ++j) { i = Math.max(index[s.charAt(j)], i);//index[a] 会将 char 转为 ascII 码,a 是 97
 ans = Math.max(ans, j - i + 1);
 index[s.charAt(j)] = j + 1; // 将 j 所在的值, 的对应位置存到 index 数组中
 }
 return ans;
 }

// public int lengthOfLongestSubstring(String s) {// int n = s.length(); // Set Character  set = new HashSet (); // int ans = 0, i = 0, j = 0; // while (i   n   j   n) {// // try to extend the range [i, j] // if (!set.contains(s.charAt(j))){ // 如果 j 没有出现重复字符, 将 j 添加到 set 中, 这个过程中,i 保持不变 // set.add(s.charAt(j++)); // ans = Math.max(ans, j - i); // 比较获取最大的 ans // } // else { // 出现重复字符, 这个字符在 i - j 之间, 所以从 i 开始逐个删除, 直到不包含重复字符 // set.remove(s.charAt(i++)); // } // } // return ans; // }
// public int lengthOfLongestSubstring(String s) { // 使用 map 存储字母和索引 // int n = s.length(), ans = 0; // Map Character, Integer  map = new HashMap (); // current index of character // // try to extend the range [i, j] // for (int j = 0, i = 0; j   n; ++j) {// if (map.containsKey(s.charAt(j))) {// i = Math.max(map.get(s.charAt(j)), i); // } // ans = Math.max(ans, j - i + 1); // map.put(s.charAt(j), j + 1); // } // return ans; // }
// public int lengthOfLongestSubstring(String s) {// int n = s.length(); // int ans = 0; // for (int i = 0; i   n; ++i) // for (int j = i + 1; j  = n; ++j) // if (allUnique(s, i, j)) ans = Math.max(ans, j - i); // return ans; // } // public boolean allUnique(String s, int start, int end) {// Set Character  set = new HashSet (); // for (int i = start; i   end; ++i) {// Character ch = s.charAt(i); // if (set.contains(ch)) return false; // set.add(ch); // } // return true; // } }

感谢各位的阅读,以上就是“Java 怎么使用指针进行搜索”的内容了,经过本文的学习后,相信大家对 Java 怎么使用指针进行搜索这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是丸趣 TV,丸趣 TV 小编将为大家推送更多相关知识点的文章,欢迎关注!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计3063字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)