Advertisement
Kame3

Фреквентен стринг - [хеширање]

Jan 16th, 2021 (edited)
1,368
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.22 KB | None | 0 0
  1. Фреквентен стринг Problem 3 (0 / 0)
  2.  
  3. Даден е стринг. Треба да се најде најчестиот под-стринг кој е дел од него и да се испечати. Доколку два под-стринга се исто фреквентни, тогаш се печати подолгиот. Доколку и овој услов го исполнуваат тогаш се печати лексикографски помалиот.
  4.  
  5. Пример: За стрингот "abc" под-стрингови се "a", "b", "c", "ab", "bc", "abc". Сите имаат иста честота па затоа се печати најдолгиот "abc".
  6.  
  7. Име на класата (Java): MostFrequentSubstring.
  8.  
  9. package com.example;
  10.  
  11. import java.io.BufferedReader;
  12. import java.io.IOException;
  13. import java.io.InputStreamReader;
  14. import java.util.HashMap;
  15. import java.util.Hashtable;
  16. import java.util.Map;
  17.  
  18. class MapEntry<K extends Comparable<K>,E> implements Comparable<K> {
  19.  
  20.     // Each MapEntry object is a pair consisting of a key (a Comparable
  21.     // object) and a value (an arbitrary object).
  22.     K key;
  23.     E value;
  24.  
  25.     public MapEntry (K key, E val) {
  26.         this.key = key;
  27.         this.value = val;
  28.     }
  29.  
  30.     public int compareTo (K that) {
  31.         // Compare this map entry to that map entry.
  32.         @SuppressWarnings("unchecked")
  33.         MapEntry<K,E> other = (MapEntry<K,E>) that;
  34.         return this.key.compareTo(other.key);
  35.     }
  36.  
  37.     public String toString () {
  38.         return "<" + key + "," + value + ">";
  39.     }
  40. }
  41.  
  42. class OBHT<K extends Comparable<K>,E> {
  43.  
  44.     // An object of class OBHT is an open-bucket hash table, containing entries
  45.     // of class MapEntry.
  46.     private MapEntry<K,E>[] buckets;
  47.  
  48.     // buckets[b] is null if bucket b has never been occupied.
  49.     // buckets[b] is former if bucket b is formerly-occupied
  50.     // by an entry that has since been deleted (and not yet replaced).
  51.  
  52.     static final int NONE = -1; // ... distinct from any bucket index.
  53.  
  54.     private static final MapEntry former = new MapEntry(null, null);
  55.     // This guarantees that, for any genuine entry e,
  56.     // e.key.equals(former.key) returns false.
  57.  
  58.     private int occupancy = 0;
  59.     // ... number of occupied or formerly-occupied buckets in this OBHT.
  60.  
  61.     @SuppressWarnings("unchecked")
  62.     public OBHT (int m) {
  63.         // Construct an empty OBHT with m buckets.
  64.         buckets = (MapEntry<K,E>[]) new MapEntry[m];
  65.     }
  66.  
  67.  
  68.     private int hash (K key) {
  69.         // Translate key to an index of the array buckets.
  70.         return Math.abs(key.hashCode()) % buckets.length;
  71.     }
  72.  
  73.  
  74.     public int search (K targetKey) {
  75.         // Find which if any bucket of this OBHT is occupied by an entry whose key
  76.         // is equal to targetKey. Return the index of that bucket.
  77.         int b = hash(targetKey); int n_search=0;
  78.         for (;;) {
  79.             MapEntry<K,E> oldEntry = buckets[b];
  80.             if (oldEntry == null)
  81.                 return NONE;
  82.             else if (targetKey.equals(oldEntry.key))
  83.                 return b;
  84.             else
  85.             {
  86.                 b = (b + 1) % buckets.length;
  87.                 n_search++;
  88.                 if(n_search==buckets.length)
  89.                     return NONE;
  90.  
  91.             }
  92.         }
  93.     }
  94.  
  95.  
  96.     public void insert (K key, E val) {
  97.         // Insert the entry <key, val> into this OBHT.
  98.         MapEntry<K,E> newEntry = new MapEntry<K,E>(key, val);
  99.         int b = hash(key); int n_search=0;
  100.         for (;;) {
  101.             MapEntry<K,E> oldEntry = buckets[b];
  102.             if (oldEntry == null) {
  103.                 if (++occupancy == buckets.length) {
  104.                     System.out.println("Hash tabelata e polna!!!");
  105.                 }
  106.                 buckets[b] = newEntry;
  107.                 return;
  108.             }
  109.             else if (oldEntry == former
  110.                     || key.equals(oldEntry.key)) {
  111.                 buckets[b] = newEntry;
  112.                 return;
  113.             }
  114.             else
  115.             {
  116.                 b = (b + 1) % buckets.length;
  117.                 n_search++;
  118.                 if(n_search==buckets.length)
  119.                     return;
  120.  
  121.             }
  122.         }
  123.     }
  124.  
  125.  
  126.     @SuppressWarnings("unchecked")
  127.     public void delete (K key) {
  128.         // Delete the entry (if any) whose key is equal to key from this OBHT.
  129.         int b = hash(key); int n_search=0;
  130.         for (;;) {
  131.             MapEntry<K,E> oldEntry = buckets[b];
  132.  
  133.             if (oldEntry == null)
  134.                 return;
  135.             else if (key.equals(oldEntry.key)) {
  136.                 buckets[b] = former;//(MapEntry<K,E>)former;
  137.                 return;
  138.             }
  139.             else{
  140.                 b = (b + 1) % buckets.length;
  141.                 n_search++;
  142.                 if(n_search==buckets.length)
  143.                     return;
  144.  
  145.             }
  146.         }
  147.     }
  148.  
  149.  
  150.     public String toString () {
  151.         String temp = "";
  152.         for (int i = 0; i < buckets.length; i++) {
  153.             temp += i + ":";
  154.             if (buckets[i] == null)
  155.                 temp += "\n";
  156.             else if (buckets[i] == former)
  157.                 temp += "former\n";
  158.             else
  159.                 temp += buckets[i] + "\n";
  160.         }
  161.         return temp;
  162.     }
  163.  
  164.  
  165.     public OBHT<K,E> clone () {
  166.         OBHT<K,E> copy = new OBHT<K,E>(buckets.length);
  167.         for (int i = 0; i < buckets.length; i++) {
  168.             MapEntry<K,E> e = buckets[i];
  169.             if (e != null && e != former)
  170.                 copy.buckets[i] = new MapEntry<K,E>(e.key, e.value);
  171.             else
  172.                 copy.buckets[i] = e;
  173.         }
  174.         return copy;
  175.     }
  176. }
  177.  
  178.  
  179. public class Main {
  180.     public static String MaxFreq(String str) {
  181.         int n = str.length();
  182.  
  183.         // go delime stringot i go stavame vo mapa.
  184.         // <String,Integer-frekventnosta>
  185.         Map<String,Integer> hm = new HashMap<>();
  186.         for (int i=0; i<n; i++) {
  187.             String s = "";
  188.             for (int j=i; j<n; j++) {
  189.                 s += str.charAt(j);
  190.                 if (hm.containsKey(s)) {
  191.                     hm.put(s,hm.get(s) + 1);
  192.                 } else {
  193.                     hm.put(s,1);
  194.                 }
  195.             }
  196.         }
  197.  
  198.         int max = 0;
  199.         String s = "";
  200.         for (Map.Entry<String,Integer> i : hm.entrySet()) {
  201.             if (i.getValue() > max) {
  202.                 max = i.getValue();
  203.                 s = i.getKey();
  204.             } else if (i.getValue() == max) {
  205.                 String ss = i.getKey();
  206.                 if (ss.length() > s.length()) {
  207.                     s = ss;
  208.                 }
  209.                 if (ss.length() == s.length()) {
  210.                     if (ss.compareTo(s) > 0) {
  211.                         s = ss;
  212.                     }
  213.                 }
  214.             }
  215.         }
  216.         return s;
  217.     }
  218.     public static void main(String[] args) throws IOException {
  219.         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  220.  
  221.         String str = br.readLine();
  222.         System.out.println(MaxFreq(str));
  223.     }
  224. }
  225.  
  226.  
  227.  
  228. Simple input-1:
  229. bab
  230.  
  231. Simple output:
  232. b
  233.  
  234.  
  235. Simple input-2:
  236. abab
  237.  
  238. Simple output:
  239. ab
  240.  
  241.  
  242. Simple input-3:
  243. abcd
  244.  
  245. Simple output:
  246. abcd
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement