Алгоритм анаграммы в Java

Я хотел бы сделать алгоритм анаграммы, но этот код не работает. Где моя вина? Например, des и sed - это анаграмма, но вывод не является анаграммой. Тем временем я должен использовать строковый метод. не массив.:)

public static boolean isAnagram(String s1 , String s2)
{
    String delStr="";
    String newStr="";

    for(int i=0;i<s1.length();i++)
    {
        for(int j=0 ; j < s2.length() ; j++)
        {
            if(s1.charAt(i)==s2.charAt(j))
            {
                delStr=s1.substring(i,i+1);
                newStr=s2.replace(delStr,"");
            }
        }           
    }

    if(newStr.equals(""))
        return true;
    else
        return false;
}

40 ответов

Более простой способ - просто отсортировать символы в обеих строках и сравнить, равны ли они:

public static boolean isAnagram(String s1, String s2){

        // Early termination check, if strings are of unequal lengths,
        // then they cannot be anagrams
        if ( s1.length() != s2.length() ) {
            return false;
        }
        s1=s1.toLowerCase();
        s2=s2.toLowerCase();
        char[] c1 = s1.toCharArray();
        char[] c2 = s2.toCharArray();
        Arrays.sort(c1);
        Arrays.sort(c2);
        String sc1 = new String(c1);
        String sc2 = new String(c2);
        return sc1.equals(sc2);
}

Лично я думаю, что это более читабельно, чем вложенные for-loop =p

Это имеет O(n log n) сложность во время выполнения, где n длина более длинной строки

Изменить: это не оптимальное решение. Смотрите ответ @aam1r для наиболее эффективного подхода (то есть, что вы должны сказать в интервью)

Это можно сделать за линейное время с использованием постоянного пространства. Вот псевдокод, который поможет вам начать:

// Create new hashtable/hashmap to keep track of how many times each character
// is being used
character_map -> new hash map

// Initial check. If lengths are not the same, they can't be anagrams.
if s1.length != s2.length:
    throw exception "Not anagrams"

// Add all characters from s1 to hashmap. Increment the value to keep track of
// number of occurences
foreach character c1 in s1:
    character_map[c1]++

// Iterate through all character in s2 and decrement count of each character.
foreach character c2 in s2:
    character_map[c2]--

// If they are anagrams, each character should be at "0" count at the point.
// If we come across a character that is not, it means that they are not anagrams
foreach key k, value v in character_map:
    if v != 0:
            throw exception "Not anagrams"

Этот код не сортируется и, следовательно, может быть выполнен с использованием простых циклов. Общее время выполнения равно O(n), а общее пространство равно O(1), что является самым быстрым решением. Количество элементов, которые вы можете иметь в хэш-карте, является постоянным (т.е. вы знаете, сколько элементов содержится в вашем наборе алфавита).

if(s1.charAt(i)==s2.charAt(j))
        delStr=s1.substring(i,i+1);
        newStr=s2.replace(delStr,"");

Этот код является хорошей демонстрацией того, почему вы должны всегда иметь curly braces вокруг вашего if, даже если есть только одно утверждение. Ваше второе задание на самом деле находится за пределами if-conditionи всегда будет происходить.

Лучший способ проверить наличие двух строк Anagram чтобы преобразовать их в массив символов (String#toCharArray), Затем сортируйте их, используя Arrays.sort метод. И сделайте сравнение по ним.


Обновлено: -

Если вы просто хотите использовать String методы, тогда вам на самом деле не нужен вложенный цикл. Вы можете сделать это только с одним.

Вот ваш модифицированный код: -

public static boolean isAnagram(String s1 , String s2){

    if (s1.length() != s2.length()) {
        return false;
    }

    for(int i = 0; i < s2.length(); i++) {

            if( !s1.contains("" + s2.charAt(i))) {
                return false;
            }

            s1 = s1.replaceFirst("" + s2.charAt(i), "");
            s2 = s2.replaceFirst("" + s2.charAt(i), "");
    }
    return true;
}

Что было бы более эффективно, так это сравнить строки в отсортированном порядке.

public static boolean isAnagram(String s1 , String s2) {
    return s1.length() == s2.length() 
        && checkSum(s1) == checkSum(s2)
        && Arrays.equals(lettersSorted(s1), lettersSorted(s2));
}

static long checkSum(String s) {
    long sqrSum = 0;
    for(int i = 0; i < s.length(); s++) {
       char ch = s.charAt(i);
       sqrSum += ch + (1L << ch);
    }
}

static char[] lettersSorted(String s) {
    char[] chars = s.toCharArray();
    Arrays.sort(chars);
    return chars;
}

Это алгоритм O(N ln N), но в среднем он будет равен O(N), если строки обычно не являются анаграммами.

Я не уверен, что вы пытаетесь сделать, но я уверен, что это не сработает (и это работает в O(n^2), Попробуйте это (который работает в O(n log n)) вместо:

public static boolean isAnagram(String s1, String s2){
  if (s1.length() != s2.length()) return false;

  char[] c1 = s1.toCharArray();
  char[] c2 = s2.toCharArray();

  Arrays.sort(c1);
  Arrays.sort(c2);

  for(int i = 0; i < c1.length; i++) {
    if(c1[i] != c2[i]) return false;
  }

  return true;
}

Существует множество возможных решений для определения, является ли строка анаграммой или нет. 1. используя Array.sort() предопределенный метод

String string1 = "abc";
String string2 = "bca";
char[] chars = string1.toCharArray();
char[] chars2 = string2.toCharArray();
Arrays.sort(chars);
Arrays.sort(chars2);
string1 = new String(chars);
string2 = new String(chars2);
if (string1.equalsIgnoreCase(string2)) {
  System.out.println("Anagram");
} else {
  System.out.println("Not Anagram");
}

Сложность времени: Ω(n log n)2. Итерационным методом

char [] charArray = str.toCharArray();
if(str.length() == str1.length()){
    for(char ch : charArray){
        if(str1.indexOf(ch) == -1){
            System.out.println("Not Anagram");
        } 
    }    
    System.out.println("Anagram");
} else {
    System.out.println("Not Anagram");
}

Сложность времени: Ω(n)

Хотя первый алгоритм более читабелен, второй алгоритм действительно выполняется быстрее.

Причина, по которой это не работает:

Используя "des" и "sed" в качестве примера.

На последней итерации, для которой он соответствует, он оценит:

if(s1.charAt(i)==s2.charAt(j))
{
    delStr=s1.substring(i,i+1);
    newStr=s2.replace(delStr,"");
}

Который будет: if( "s" == "s")

Затем он войдет в блок if и оценит

newStr = "sed".replace("s","");

который даст вам "ed" вместо пустой строки.

Мораль этой истории заключается в том, что вы всегда заменяете персонажей из s2 менее одним персонажем, который никогда не будет пустым.

Использование String.replace() в любом случае плохо, потому что по умолчанию оно заменит все экземпляры персонажа. С String.replace() он будет считать "sed" анаграммой "seeeeeeed". Вы бы лучше использовать String.replaceFirst().

В любом случае, отправной точкой является внесение следующих изменений:

String newStr = s2;
...
// inside if block
newStr = newStr.replaceFirst( delStr, "" );
import java.util.Scanner;

public class Anagrams {

static boolean isAnagram(String a, String b) {
    a = a.toLowerCase();
    b = b.toLowerCase();
    if (a.length() != b.length()) {
        return false;
    }

    char[] chars = a.toCharArray();
    for (char c : chars) {
        int index = b.indexOf(c);
        if (index != -1) {
            b = b.substring(0, index) + b.substring(index + 1, b.length());
        } else {
            return false;
        }
    }
    return b.isEmpty();
}

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    String a = scan.next();
    String b = scan.next();
    scan.close();
    boolean ret = isAnagram(a, b);
    System.out.println((ret) ? "Anagrams" : "Not Anagrams");

    }
}

Ниже приведен краткий фрагмент кода, который определяет, являются ли две строки анаграммами в одной итерации обеих строк, плюс заключительная итерация массива из 256 элементов. Этот подход позволяет избежать сортировки символов в строках и преобразования в / из массивов Strings/char путем записи количества символов в массиве отображения.

static boolean isAnagram(String s1, String s2) {
    if (s1.length() != s2.length()) return false;
    int n = s1.length();
    int[] charMap = new int[256];
    for (int i = 0; i < n; i++) {
        char c1 = s1.charAt(i);
        charMap[c1]++;
        char c2 = s2.charAt(i);
        charMap[c2]--;
    }
    for (int i = 0; i < charMap.length; i++) {
        if (charMap[i] != 0) return false;
    }
    return true;
}

Этот код в основном увеличивает и уменьшает положение индекса в массиве, соответствующем символу. Если какой-либо из элементов массива отличен от нуля в конце итерации, количество приращений и уменьшений было неодинаковым, и поэтому строки содержат разные символы и не могут быть анаграммами друг друга.

Учитывая, что этот алгоритм повторяет две строки одинакового размера, время выполнения равно O(n). Сложность пространства равна O(1), поскольку charMap всегда постоянен в зависимости от требований кодировки.

public boolean checkAnagram(String s, String t) {
    s = s.toLowerCase();
    t = t.toLowerCase();

    // We can ignore blanks
    char[] word1 = s.replaceAll("\\s","").toCharArray();
    char[] word2 = t.replaceAll("\\s","").toCharArray();

    // Anagrams length should be the same
    if (word1.length != word2.length) {
        return false;
    }

    // Sorting arrays is pretty fast, it can be O(logn) 
    Arrays.sort(word1);
    Arrays.sort(word2);

    if (Arrays.equals(word1, word2)) {
        return true;
    }

    return false;
}
Using HashMap
public boolean isAnagram(String word, String anagram) {
    if (word.length() != anagram.length())
        return false;

    int count = 0;
    Map<Character, Integer> map = new HashMap<>();

    for (int i = 0; i < word.length(); i++) {
        if (!map.containsKey(word.charAt(i)))
            map.put(word.charAt(i), 1);
        else
            map.put(word.charAt(i), map.get(word.charAt(i)) + 1);
    }

    for (int i = 0; i < anagram.length(); i++) {
        if (!map.containsKey(anagram.charAt(i)))
            return false;
        else if (map.get(anagram.charAt(i)) >= 1)
            map.put(anagram.charAt(i), map.get(anagram.charAt(i)) - 1);
        else
            return false;
    }

    return true;
}

Это реализация Java, которую я написал для использования массива вместо HashMap. Это экономит место, плюс массивы действительно быстрые.

public static boolean anagram(String s, String t) { 
        if (s.length() != t.length()) return false;

        int[] arr = new int[123];
        for (char c : s.toCharArray())
            arr[c]++;
        for (char c : t.toCharArray())
            arr[c]--;
        for (int i : arr)
            if (i != 0)
                return false;
        return true;
    }

O(n) решение без какой-либо сортировки и использования только одной карты. Также добавлена ​​правильная нулевая проверка, отсутствующая в других решениях.

public boolean isAnagram(String leftString, String rightString) {
  if (leftString == null || rightString == null) {
    return false;
  } else if (leftString.length() != rightString.length()) {
    return false;
  }

  Map<Character, Integer> occurrencesMap = new HashMap<>();

  for(int i = 0; i < leftString.length(); i++){
    char charFromLeft = leftString.charAt(i);
    int nrOfCharsInLeft = occurrencesMap.containsKey(charFromLeft) ? occurrencesMap.get(charFromLeft) : 0;
    occurrencesMap.put(charFromLeft, ++nrOfCharsInLeft);
    char charFromRight = rightString.charAt(i);
    int nrOfCharsInRight = occurrencesMap.containsKey(charFromRight) ? occurrencesMap.get(charFromRight) : 0;
    occurrencesMap.put(charFromRight, --nrOfCharsInRight);
  }

  for(int occurrencesNr : occurrencesMap.values()){
    if(occurrencesNr != 0){
      return false;
    }
  }

  return true;
}

и менее универсальное решение, но чуть более быстрое:

public boolean isAnagram(String leftString, String rightString) {
  if (leftString == null || rightString == null) {
    return false;
  } else if (leftString.length() != rightString.length()) {
    return false;
  }

  char letters[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
  Map<Character, Integer> occurrencesMap = new HashMap<>();
  for (char l : letters) {
    occurrencesMap.put(l, 0);
  }

  for(int i = 0; i < leftString.length(); i++){
    char charFromLeft = leftString.charAt(i);
    Integer nrOfCharsInLeft = occurrencesMap.get(charFromLeft);
    occurrencesMap.put(charFromLeft, ++nrOfCharsInLeft);
    char charFromRight = rightString.charAt(i);
    Integer nrOfCharsInRight = occurrencesMap.get(charFromRight);
    occurrencesMap.put(charFromRight, --nrOfCharsInRight);
  }

  for(Integer occurrencesNr : occurrencesMap.values()){
    if(occurrencesNr != 0){
      return false;
    }
  }

  return true;
}

Вот еще одно предложение без инициализации int[256], но int[26] для английского алфавита.

public static void main(String[] args) {
    System.out.println(isAnagram("restful", "fluster"));
}

static boolean isAnagram(String s1, String s2) {
    if (s1.length() != s2.length()) {
        return false;
    }
    int[] countArray = new int[26];
    for (int i = 0; i < s1.length(); i++) {
        countArray[getIndex(i, s1)]++;
        countArray[getIndex(i, s2)]--;
    }
    for (int i = 0; i < countArray.length; i++) {
        if (countArray[i] != 0) {
            return false;
        }
    }
    return true;
}

public static int getIndex(int position, String value) {
    return value.charAt(position) - 'a';
}

Лучший Георгий Цопуридис

Я думаю, что это работает со сложностью O(2n)

public static boolean isAnagram(String str1, String str2){
    if(str1.length() != str2.length()){ return false;}
    int[] buffer = new int[256];
    for(char ch : str1.toCharArray()){
        buffer[ch]++;
    }
    for(char ch : str2.toCharArray()){
        if(buffer[ch]==0) return false;
        buffer[ch] = (buffer[ch] > 0)?(buffer[ch] - 1 ): -1 ;   
    }
    return true;
}

Вы можете использовать комбинацию потоков и математических вычислений, как в:

      public static boolean isAnagram(String s1, String s2){
    if ( s1.length() != s2.length() ) {
        return false;
    }
    int s1Sum = s1.chars().sum();
    int s2Sum = s2.chars().sum();
    return s1Sum == s2Sum;
}

Более быстрая версия с использованием подхода битового вектора для подстрок анаграммы

public boolean isAnagram(String _source1, String _source2)
{

    int flag = 0, char_index = 0, counter = 0;
    if(_source2.length() < _source1.length()){
        return false;
    }
    char[] _stringchar = _source1.toCharArray();
    char[] _tocheck = _source2.toCharArray();
    for(char character : _stringchar)
    {
        char_index = character - 'a';
        if((flag & (1 << char_index)) == 0)
            flag |= (1 << char_index);
    }

    for(char toCheckcChar : _tocheck)
    {
        char_index = toCheckcChar - 'a';

        if((flag & (1 << char_index)) > 0)
            counter++;
        else
            counter = 0;

        if(counter == _source1.length())
            return true;

    }

    return false;
}

Используя потоки Java, это можно упростить всего за 5 строк кода ( https://github.com/vspiliop/java-puzzles/blob/master/src/gy/etiolo/puzzles/streams/Anagrams.java):

/**
 * Are two strings anagrams.
 */
public class Anagrams {
  public static void main(String ... args) {
    String word1 = "abcdefg";
    String word2 = "gfedabc";

    System.out.println("Are they anagrams: " + isAnagram(word1, word2));
  }

  private static boolean isAnagram(String word1, String word2) {
    int [] mask = new int[26];
    Arrays.fill(mask, 0);
    word1.toLowerCase().chars().forEach(c -> mask['z' - c]++);
    word2.toLowerCase().chars().forEach(c -> mask['z' - c]--);
    return Arrays.stream(mask).sum() == 0;
  }
}

Проверьте таблицу ascii здесь: http://www.asciitable.com/

public static void arrang(String s, String str){

  char a[] = new char[s.length()];
  char b[] = new char[str.length()];
  int arr1[] = new int[s.length()];
  int arr2[] = new int[str.length()];

  if( a.length == b.length ) {
    System.out.println("two numbers can't be anagrams");
    return;
  }

  for( int i = 0 ; i < str.length() ; i++ ) {
    a[i] = s.toLowerCase().charAt(i);
    b[i] = str.toLowerCase().charAt(i);
  }

  // casting
  for( int i = 0 ; i < s.length() ; i++ ) {
    arr1[i]=(int)a[i];
    arr2[i]=(int)b[i];
  }

  for( int i = 0 ; i < s.length() ; i++ ) {
    for( int j = 1 ; j < s.length() ; j++ ) {
      if( arr1[j-1] > arr1[j] ) {
        int temp = arr1[j];
        arr1[j] = arr1[j-1];
        arr1[j-1] = temp;
      }
    }
  }

  for( int i = 0 ; i < s.length() ; i++ ) {
    for( int j = 1 ; j < s.length() ; j++ ) {
      if( arr2[j-1] > arr2[j] ) {
        int temp = arr2[j];
        arr2[j] = arr2[j-1];
        arr2[j-1] = temp;
      }
    }
  }

  for( int i = 0 ; i < s.length() ; i++ ) {
    a[i] = (char)arr1[i];
    b[i] = (char)arr2[i];
  }

  int count = 0;
  for( int i = 0 ; i < s.length() ; i++ ) {
    if( a[i] == b[i] ) {
      count++;
    }
  }
  if( count == s.length() ) {
    System.out.println("two strings are anagrams");
  }
  else{
    System.out.println("not anagrams");
  }
}

Я потратил некоторое время на то, чтобы на самом деле описать логику и написать код для проверки двух строк, являются ли они анаграммами или нет. Конечно, с помощью приведенных выше ответов! XD

public static void main(String[] args) {

    Map<Character, Integer> char_map = new HashMap<Character, Integer>();
    Map<Character, Integer> empty_map = new HashMap<Character, Integer>();
    String a = "HelloP";
    String b = "HePlol";

    if (a.length() != b.length()) {
        System.out.println("false");
        System.exit(0);
    }

    for (char c : a.toLowerCase().toCharArray()) {
        empty_map.put(c, 0);
        if (char_map.containsKey(c))
            char_map.put(c, 1 + char_map.get(c));
        else
            char_map.put(c, 1);
    }

    for (char c : b.toLowerCase().toCharArray())
        if (char_map.containsKey(c))
            char_map.put(c, char_map.get(c) - 1);

    System.out.println(char_map.equals(empty_map));
}
public static boolean isAnagram(String s1, String s2) {
    if (s1.length() != s2.length()) {
        return false;
    }
    Map<Character, Integer> frequencies = new HashMap<>();
    for (int i = 0; i < s1.length(); i++) {
        if (frequencies.containsKey(s1.charAt(i))) {
            frequencies.put(s1.charAt(i), frequencies.get(s1.charAt(i)) + 1);
        } else {
            frequencies.put(s1.charAt(i), 1);
        }
    }
    for (int i = 0; i < s2.length(); i++) {
        if (frequencies.containsKey(s2.charAt(i))) {
            int frequency = frequencies.get(s2.charAt(i));
            if (--frequency == 0) {
                frequencies.remove(s2.charAt(i));
            } else {
                frequencies.put(s2.charAt(i), frequencies.get(s2.charAt(i)) - 1);
            }
        }
    }
    return frequencies.isEmpty();
}
  1. Сравните длины обеих строк, если они равны
  2. Преобразуйте обе строки в нижний регистр, чтобы вы могли эффективно сравнивать
  3. Цикл, чтобы проверить, содержит ли String1 символ в String2.
  4. Установите счетчик на длину одной из строк и уменьшите -1 при совпадении

    public boolean isAnagram(String s1, String s2) {
    
    if(s1.length() != s2.length()) {
        return false;
    }
    
    int counter= s1.length();
    s1 = s1.toLowerCase();
    s2= s2.toLowerCase();
    
    for (int i=0; i<s1.length();i++ ) {
    
            if (s2.contains(s1.charAt(i)+"")) {
    
                counter--;              
        }
    }
    
    if (counter<=0) {
    
        return true;
    }
    return false;
    }
    

Решение, оптимизированное для повышения производительности.

Чем отличается от других решений:

  • Только в самом худшем случае он повторяется один раз через text1 и один раз через text2.
  • Сбой быстро : возвращает false, как только встречает символ в text1, который не является частью text2
  • Сохраняет гистограмму как int[], что намного быстрее, чем HashMaps или аналогичный
  • Может обрабатывать строки с любым символом (даже смайликами 😉)

Пример кода:

      public static boolean check(String text1, String text2) {
    requireNonNull(text1, "text1 must not be null");
    requireNonNull(text2, "text2 must not be null");
    if (text1 == text2) return true;

    var text1Chars = text1.toCharArray();
    var text2Chars = text2.toCharArray();
    if (text1Chars.length != text2Chars.length) return false;

    var text2Counts = new int[Character.MAX_CODE_POINT];
    var text2Index = 0;

    loopThroughText1:
    for (char charOfText1 : text1Chars) {
        if (text2Counts[charOfText1] > 0) {
            text2Counts[charOfText1]--;
        } else {
            while (text2Index < text2Chars.length) {
                var charOfText2 = text2Chars[text2Index++];
                if (charOfText1 == charOfText2) {
                    continue loopThroughText1;
                }
                text2Counts[charOfText2]++;
            }
            return false;
        }
    }
    return text2Index >= text2Chars.length;
}

Соответствующий метод испытаний:

      @ParameterizedTest
@CsvSource({
        "a,a,true",
        "a,b,false",
        "aa,a,false",
        "a,aa,false",
        "aa,aa,true",
        "vhjsd682ahjsvdi7861rUZVFD/Ias6srf871r23,vhjsd682ahjsvdi7861rUZVFD/Ias6srf871r23,true",
        "A,a,false",
        "🎈,🎈,true",
        "🎈,💣,false",
})
public void check(String text1, String text2, boolean expected) {
    assertEquals(AnagramChecker.check(text1, text2), expected);
}

Я думаю, что здесь более читаемый и простой способ решить эту проблему. Сложность O(n) и только две карты

      public static boolean isAnagram(String word, String word2) {

if (word.equals(word2)) return true;
if (word == null || word2 == null) return false;
if (word.length() != word2.length()) return false;

Map<Character, Integer> map = new HashMap<>();
Map<Character, Integer> map2 = new HashMap<>();

for (int i = 0; i < word.length(); i++) {
    map.merge(word.charAt(i), 1, (oldVal, value) -> oldVal++);
}

for (int i = 0; i < word2.length(); i++) {
    map2.merge(word2.charAt(i), 1, (oldVal, value) -> oldVal++);
}

return map.equals(map2);

}

Я добавляю это как уникальный подход O(n), хотя, как и сравнение хэшей, он на самом деле только определяет, является ли высокая вероятность того, что две строки являются анаграммами друг друга, а не обеспечивает полную уверенность.

      public static boolean isAnagram(String s1, String s2) {
    if (s1.length()!=s2.length()) return false;
    int sum1=0, sum2=0;
    int xor1=0, xor2=0;
    int prod1=1, prod2=1;
    for (int i=0; i<s1.length(); i++) {
        char c1=s1.charAt(i);
        char c2=s2.charAt(i);
        sum1 += c1;
        sum2 += c2;
        xor1 ^= c1;
        xor2 ^= c2;
        prod1 *= c1;
        prod2 *= c2;
    }
    return sum1==sum2 && xor1==xor2 && prod1==prod2;
}

Однажды я сделал тест на собеседование по поводу анаграмм. Я загрузил его в свой аккаунт на github. Код Java проверяет, является ли текстовый файл (с несколькими строками) стихотворением анаграммы или текстом анаграммы.

https://github.com/javocsoft/anagram_poem_checker

Надеюсь, поможет!

До свидания.

    String str1="Mother In Law";
    String str2="Hitler Woman";
    char[] anag1=str1.replaceAll("\\s", "").toLowerCase().toCharArray();
    char[] anag2=str2.replaceAll("\\s", "").toLowerCase().toCharArray();
    Arrays.sort(anag1);
    Arrays.sort(anag2);
    System.out.println(Arrays.equals(anag1, anag2)? "words are anagrams":"words are not anagrams");

Вот мое решение с вашей стороны

private static boolean isAnagram(String s1, String s2){
    int count = 0;
    boolean flag = false;

    if(s1.length() != s2.length()){
        return false;
    }
    //checks whether both word's letters are the same
    for (int i = 0; i < s1.length(); i++){
        for (int j = 0; j < s2.length(); j++){
            if(s1.charAt(i) == s2.charAt(j)){
                count++;
                break;
            }
        }
    }
    //if count equals to one of the Strings length then it is an anagram
    if(count == s2.length() ){
        flag = true;
    }
    return flag;
}
      public static boolean isAnagram(String str1, String str2){
    if(str1.length() != str2.length())
      return false;
    int lengthStr1 = str1.length();
    for(char c : str2.toCharArray()) {
       str1 = str1.replaceFirst(c+"", "");
    if(str1.length() == lengthStr1--)
       return false;
    }
    return true;
}
import java.util.Scanner;

public class JavaProgram
{
    public static void main(String[] input)
    {
        String str1, str2;
        int len, len1, len2, i, j, found=0, not_found=0;
        Scanner scan = new Scanner(System.in);

        System.out.print("Enter First String : ");
        str1 = scan.nextLine();
        System.out.print("Enter Second String : ");
        str2 = scan.nextLine();

        len1 = str1.length();
        len2 = str2.length();

        if(len1 == len2)
        {
            len = len1;
            for(i=0; i<len; i++)
            {
                found = 0;
                for(j=0; j<len; j++)
                {
                    if(str1.charAt(i) == str2.charAt(j))
                    {
                        found = 1;
                        break;
                    }
                }
                if(found == 0)
                {
                    not_found = 1;
                    break;
                }
            }
            if(not_found == 1)
            {
                System.out.print("Strings are not Anagram to Each Other..!!");
            }
            else
            {
                System.out.print("Strings are Anagram");
            }
        }
        else
        {
            System.out.print("Both Strings Must have the same number of Character to be an Anagram");
        }
    }
}
Другие вопросы по тегам