Heim >Java >javaLernprogramm >Beispielcode-Sharing zur Bestimmung, ob zwei Zeichenfolgen in Java gegeneinander rotierte Wörter sind

Beispielcode-Sharing zur Bestimmung, ob zwei Zeichenfolgen in Java gegeneinander rotierte Wörter sind

黄舟
黄舟Original
2017-05-14 09:18:532292Durchsuche

Dieser Artikel stellt hauptsächlich das relevante Wissen vor, um zu bestimmen, ob Zeichenfolge a und b gegenseitig rotierte Wörter sind und einen guten Referenzwert haben. Schauen wir es uns mit dem Editor unten an

Rotationswort: Die neue Zeichenfolge, die durch das Verschieben eines beliebigen Teils der Zeichenfolge str nach hinten entsteht, wird als Rotationswort der Zeichenfolge str bezeichnet.

Zu den Rotationswörtern von abc gehören beispielsweise abc, acb, cba, ...

Beurteilen Sie, ob str1 und str2 Rotationswörter voneinander sind. Die optimale Lösung kann sein dass die Zeitkomplexität O(n) ist (n ist die Länge der Zeichenfolge)

Die Methode ist wie folgt:

1 Bestimmen Sie, ob die Längen gleich sind

2. Wenn die Längen gleich sind, konstruieren Sie eine große Zeichenfolge, str1+str1 (str1+str1 enthält alle gedrehten Wörter von str1)

3. Verwenden Sie den KPM-Algorithmus, um zu bestimmen, ob eine große Zeichenfolge str2 enthält

Das Folgende ist die spezifische Algorithmusimplementierung. Sie müssen zuerst den KPM-Algorithmus verstehen

package k;

import java.util.Scanner;

public class test1 {
 static int[] next; //next数组
 static String str1; //字符串str1
 static String str2; //字符串str2
 static String str; //字符串str=str1+str1

 public static void main(String[] args) {
  Scanner in = new Scanner(System.in);

  str1 = in.next(); //获取输入的第一个字符串
  str2 = in.next(); //获取输入的第二个字符串

  if (str1.length() != str2.length()) //如果长度不相等,那么就肯定不是互为旋转词
   System.out.println(str1 + "与" + str2 + "不是互为旋转词");
  
  else 
  {
   str = str1 + str1; 
   makeNext(); //构建next数组
 
   check(); //判断是否为旋转词
  }
 }

 private static void check() {
  int i = 0;
  int j = 0;
  while (i < str2.length() && j < str.length()) 
   if (i == -1 || str2.charAt(i) == str.charAt(j)) {
    i++;
    j++;
   } else {
    i = next[i];
   }
   if (i >= str2.length())
    System.out.println(str1 + "与" + str2 + "互为旋转词");
   else 
    System.out.println(str1 + "与" + str2 + "不是互为旋转词");
 }

 private static void makeNext() {
  next = new int[str2.length()];
  int i = 0;
  int k = -1;
  next[0] = -1;
  while (i < str2.length() - 1) {
   while (k >= 0 && str2.charAt(i) != str2.charAt(k))
    k = next[k];
   i++;
   k++;
   if (str2.charAt(i) == str2.charAt(k))
    next[i] = next[k];
   else
    next[i] = k;
  }
 }
}

Das obige ist der detaillierte Inhalt vonBeispielcode-Sharing zur Bestimmung, ob zwei Zeichenfolgen in Java gegeneinander rotierte Wörter sind. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn