Advertisement
mvCode

MostFrequentSubstring , Frekventen String AIPS

Jan 10th, 2020
392
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.53 KB | None | 0 0
  1. Фреквентен стринг Problem 3 (0 / 1)
  2.  
  3. Даден е стринг. Треба да се најде најчестиот под-стринг кој е дел од него и да се испечати. Доколку два под-стринга се исто фреквентни, тогаш се печати подолгиот. Доколку и овој услов го исполнуваат тогаш се печати лексикографски помалиот.
  4.  
  5. Пример: За стрингот "abc" под-стрингови се "a", "b", "c", "ab", "bc", "abc". Сите имаат иста честота па затоа се печати најдолгиот "abc".
  6.  
  7. Име на класата (Java): MostFrequentSubstring.
  8.  
  9.  
  10. import java.io.BufferedReader;
  11. import java.io.IOException;
  12. import java.io.InputStreamReader;
  13.  
  14. class MapEntry<K extends Comparable<K>,E> implements Comparable<K> {
  15.  
  16.     K key;
  17.     E value;
  18.  
  19.     public MapEntry (K key, E val) {
  20.         this.key = key;
  21.         this.value = val;
  22.     }
  23.  
  24.     public int compareTo (K that) {
  25.         @SuppressWarnings("unchecked")
  26.         MapEntry<K,E> other = (MapEntry<K,E>) that;
  27.         return this.key.compareTo(other.key);
  28.     }
  29.  
  30.     public String toString () {
  31.         return "(" + key + "," + value + ")";
  32.     }
  33. }
  34.  
  35. class SLLNode<E> {
  36.     protected E element;
  37.     protected SLLNode<E> succ;
  38.  
  39.     public SLLNode(E elem, SLLNode<E> succ) {
  40.         this.element = elem;
  41.         this.succ = succ;
  42.     }
  43.  
  44.     @Override
  45.     public String toString() {
  46.         return element.toString();
  47.     }
  48. }
  49.  
  50. class CBHT<K extends Comparable<K>, E> {
  51.  
  52.     private SLLNode<MapEntry<K,E>>[] buckets;
  53.  
  54.     @SuppressWarnings("unchecked")
  55.     public CBHT(int m) {
  56.         buckets = (SLLNode<MapEntry<K,E>>[]) new SLLNode[m];
  57.     }
  58.  
  59.     private int hash(K key) {
  60.         return Math.abs(key.hashCode()) % buckets.length;
  61.     }
  62.  
  63.     public SLLNode<MapEntry<K,E>> search(K targetKey) {
  64.         int b = hash(targetKey);
  65.         for (SLLNode<MapEntry<K,E>> curr = buckets[b]; curr != null; curr = curr.succ) {
  66.             if (targetKey.equals(((MapEntry<K, E>) curr.element).key))
  67.                 return curr;
  68.         }
  69.         return null;
  70.     }
  71.  
  72.     public void insert(K key, E val) {      // Insert the entry <key, val> into this CBHT.
  73.         MapEntry<K, E> newEntry = new MapEntry<K, E>(key, val);
  74.         int b = hash(key);
  75.         for (SLLNode<MapEntry<K,E>> curr = buckets[b]; curr != null; curr = curr.succ) {
  76.             if (key.equals(((MapEntry<K, E>) curr.element).key)) {
  77.                 curr.element = newEntry;
  78.                 return;
  79.             }
  80.         }
  81.         buckets[b] = new SLLNode<MapEntry<K,E>>(newEntry, buckets[b]);
  82.     }
  83.  
  84.     public void delete(K key) {
  85.         int b = hash(key);
  86.         for (SLLNode<MapEntry<K,E>> pred = null, curr = buckets[b]; curr != null; pred = curr, curr = curr.succ) {
  87.             if (key.equals(((MapEntry<K,E>) curr.element).key)) {
  88.                 if (pred == null)
  89.                     buckets[b] = curr.succ;
  90.                 else
  91.                     pred.succ = curr.succ;
  92.                 return;
  93.             }
  94.         }
  95.     }
  96.  
  97.     public String toString() {
  98.         String temp = "";
  99.         for (int i = 0; i < buckets.length; i++) {
  100.             temp += i + ":";
  101.             for (SLLNode<MapEntry<K,E>> curr = buckets[i]; curr != null; curr = curr.succ) {
  102.                 temp += curr.element.toString() + " ";
  103.             }
  104.             temp += "\n";
  105.         }
  106.         return temp;
  107.     }
  108.  
  109. }
  110.  
  111. public class MostFrequentSubstring {
  112.     public static void main (String[] args) throws IOException {
  113.         CBHT<String,Integer> tabela = new CBHT<String,Integer>(300);
  114.         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  115.  
  116.         String word = br.readLine().trim();
  117.  
  118.         // Vashiot kod tuka....
  119.         char []letters = word.toCharArray();
  120.  
  121.         // generates substring
  122.  
  123.         for( int i=1; i < letters.length; i++ ) { // determines substring lenght
  124.  
  125.             for (int j = 0; j < letters.length - i + 1; j++) { // determines substring beginning and puts them in hash
  126.  
  127.                 String str = "";
  128.                 for (int k = j; k < j + i; k++) { // determines substrings
  129.  
  130.                     str += Character.toString(letters[k]);
  131.                 }
  132.  
  133.                 SLLNode<MapEntry<String, Integer>> node = tabela.search(str); // determines if the substring has been allready hashed
  134.  
  135.                 if (node == null)
  136.                     tabela.insert(str, 1);
  137.  
  138.                 else
  139.                     tabela.insert(str, (node.element.value + 1)); // enlarges the sub substring frequency by 1
  140.             }
  141.         } // done with hashing
  142.  
  143.         // looking for the most frequent string in the hash
  144.         String mostFrequent = "";
  145.         int frequencyMax = 0;
  146.  
  147.         for( int i=1; i < letters.length; i++ ) { // generates substrings, same as above
  148.  
  149.             for (int j = 0; j < letters.length - i + 1; j++) {
  150.  
  151.                 String str = "";
  152.                 for (int k = j; k < j + i; k++) {
  153.  
  154.                     str += Character.toString(letters[k]);
  155.                 }
  156.  
  157.                 SLLNode<MapEntry<String, Integer>> node = tabela.search(str);
  158.  
  159.                 if (node == null)
  160.                     continue;
  161.  
  162.                 else {
  163.                     if ( node.element.value > frequencyMax ) {
  164.                         frequencyMax = node.element.value;
  165.                         mostFrequent = str;
  166.                     }
  167.                     else if( node.element.value == frequencyMax ) {
  168.                         if( str.length() > mostFrequent.length() ) {
  169.                             frequencyMax = node.element.value;
  170.                             mostFrequent = str;
  171.                         }
  172.                         else if( str.length() == mostFrequent.length() ) {
  173.                             if( lexikographicValue( str ) < lexikographicValue( mostFrequent ) ) {
  174.                                 frequencyMax = node.element.value;
  175.                                 mostFrequent = str;
  176.                             }
  177.                         }
  178.                     }
  179.                 }
  180.             }
  181.         }
  182.  
  183.         System.out.println( mostFrequent );
  184.     }
  185.  
  186.     public static int lexikographicValue( String str ) {
  187.  
  188.         char letters[] = str.toCharArray();
  189.         int val = 0;
  190.         for( int i = 0; i < letters.length; i++ ) {
  191.             val += (int)letters[i];
  192.         }
  193.         return val;
  194.     }
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement