LRS.java


Below is the syntax highlighted version of LRS.java from §4.2 Sorting and Searching.


/******************************************************************************
 * Compilation: javac LRS.java
 * Execution: java LRS < file.txt
 * Dependencies: StdIn.java
 *
 * WARNING: TAKES QUADRATIC TIME AS OF JAVA 7u6.
 *
 * Reads a text corpus from stdin, replaces all consecutive blocks of
 * whitespace with a single space, and then computes the longest
 * repeated substring in that corpus. Suffix sorts the corpus using
 * the system sort, then finds the longest repeated substring among
 * consecutive suffixes in the sorted order.
 *
 * % java LRS < mobydick.txt
 * ',- Such a funny, sporty, gamy, jesty, joky, hoky-poky lad, is the Ocean, oh! Th'
 *
 * % java LRS
 * aaaaaaaaa
 * 'aaaaaaaa'
 *
 * % java LRS
 * abcdefg
 * ''
 *
 ******************************************************************************/
import java.util.Arrays;
publicclassLRS{
// return the longest common prefix of s and t
publicstaticStringlcp(String s,String t){
int n = Math.min(s.length(), t.length());
for(int i =0; i < n; i++){
if(s.charAt(i)!= t.charAt(i))
return s.substring(0, i);
}
return s.substring(0, n);
}
// return the longest repeated string in s
publicstaticStringlrs(String s){
// form the N suffixes
int n = s.length();
 String[] suffixes =new String[n];
for(int i =0; i < n; i++){
 suffixes[i]= s.substring(i, n);
}
// sort them
 Arrays.sort(suffixes);
// find longest repeated substring by comparing adjacent sorted suffixes
String lrs ="";
for(int i =0; i < n-1; i++){
String x =lcp(suffixes[i], suffixes[i+1]);
if(x.length()> lrs.length())
 lrs = x;
}
return lrs;
}
// read in text, replacing all consecutive whitespace with a single space
// then compute longest repeated substring
publicstaticvoidmain(String[] args){
String s = StdIn.readAll();
 s = s.replaceAll("\\s+"," ");
 StdOut.println("'"+lrs(s)+"'");
}
}

AltStyle によって変換されたページ (->オリジナル) /


Copyright © 2000–2022, Robert Sedgewick and Kevin Wayne.
Last updated: Thu Aug 11 10:29:15 EDT 2022.