[英]To split a string and to check if they are anagram to each other
我正在嘗試解決此問題: https : //www.hackerrank.com/challenges/anagram
這是我的代碼:
import java.util.*;
public class Anagram {
public static void main(String[] args)
{
Scanner reader = new Scanner(System.in);
int t = reader.nextInt();
while((t--) > 0)
{
String input = reader.nextLine();
if((input.length()) % 2 == 1)
System.out.println(-1);
else
{
int x = input.length();
int q = (int)(Math.floor((x / 2)));
String input1 = input.substring(0, q);
String input2 = input.substring(q, x);
int [] count2 = new int[26];
for(int i = 0; i < input2.length(); i++)
{
char ch2 = input2.charAt(i);
count2[ch2 - 'a']++;
}
// int [] count1 = new int[26];
for(int i = 0; i < input1.length(); i++)
{
char ch1 = input1.charAt(i);
if(count2[i] > 0)
count2[ch1 - 'a']--;
}
int count = 0;
for(int j = 0; j < 26; j++)
{
count = count + Math.abs(count2[j]);
}
System.out.println(count);
}
}
}
}
樣本輸入
6
aaabbb
ab
abc
mnop
xyyx
xaxbbbxx
預期產量
3
1
-1
2
0
1
我的輸出
0
4
1
-1
2
2
誰能告訴我哪里出了問題? 我找不到錯誤...
您可以使用它來檢查兩個字符串是否為回文式:
String original = "something";
String reverse = new StringBuilder(original).reverse().toString();
boolean anagram = original.equals(reverse);
由於以下這一行,您的第一個輸出始終為0:
int t = reader.nextInt();
其次是reader.nextLine();
。 有關更多詳細信息,請查看這篇文章 。 為了快速修復,將該行更改為:
int t = Integer.parseInt(reader.nextLine());
現在,讓我們從以下兩個語句開始:
int x = input.length();
int q = (int)(Math.floor((x/2)));
無需在此處執行Math.floor
。 x/2
是整數除法,只會給您整數結果。
移動到第二for
循環。 您使用了以下條件:
if(count2[i]>0)
count2[ch1-'a']--;
注意條件錯誤嗎? 它應該是count2[ch1 - 'a'] > 0
。 而且,您將錯過該計數不大於0的情況,在這種情況下,您將必須執行++
。 順便說一句,由於您Math.abs()
在執行Math.abs()
,因此您不需要該條件。 只是做一個--
:
for( int i = 0; i < input1.length(); i++ ) {
char ch1 = input1.charAt(i);
count2[ch1-'a']--;
}
順便說一句,最終結果將是count / 2
,而不是count
,因為count
包含從input1到input2的總不匹配,反之亦然。 但是我們只需要修復其中一個以匹配另一個即可。 因此,只考慮總失配的一半。
根據您的問題,主要邏輯可以更改為如下所示。
注-我僅添加了主要邏輯,並在此排除了用戶輸入。
public static void main(String[] args) {
String str = "acbacccbaac";
int len = str.length();
String str1 = null, str2 = null;
if(len %2 != 0) {//check for odd length
str1 = str.substring(0, len/2);
str2 = str.substring(len/2+1, len);
}else {//check for even length
str1 = str.substring(0, len/2);
str2 = str.substring(len/2, len);
}
char[] arr1 = str1.toLowerCase().toCharArray();
Arrays.sort(arr1);
char[] arr2 = str2.toLowerCase().toCharArray();
Arrays.sort(arr2);
if(Arrays.equals(arr1, arr2))
System.out.println("Yes");
else
System.out.println("No");
}
我在HackerRank個人資料中針對相同問題實施了這種方法,效果很好。
這是我對問題的解決方案,並且有效!
static int anagram(String s) {
String a = "";
String b = "";
if (s.length() % 2 == 0) {
a = s.substring(0, s.length() / 2);
b = s.substring((s.length() / 2), s.length());
}
if (s.length() % 2 != 0) {
a = s.substring(0, s.length() / 2);
b = s.substring((s.length() / 2), s.length());
}
if (a.length() == b.length()) {
char[] aArray = a.toCharArray();
char[] bArray = b.toCharArray();
HashMap<Character, Integer> aMap = new HashMap<Character, Integer>();
HashMap<Character, Integer> bMap = new HashMap<Character, Integer>();
for (char c : aArray) { // prepare a Hashmap of <char>,<count> for first string
if (aMap.containsKey(c)) {
aMap.put(c, aMap.get(c) + 1);
} else {
aMap.put(c, 1);
}
}
for (char c : bArray) {// prepare a Hashmap of <char>,<count> for second string
if (bMap.containsKey(c)) {
bMap.put(c, bMap.get(c) + 1);
} else {
bMap.put(c, 1);
}
}
int change = 0;
for (Map.Entry<Character, Integer> entry : bMap.entrySet()) {
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
if (!aMap.containsKey(entry.getKey())) {
change += entry.getValue();
} else {
if (entry.getValue() > aMap.get(entry.getKey())) {
change += entry.getValue() - aMap.get(entry.getKey());
} else {
//change += entry.getValue();
}
}
}
return change;
} else {
return -1;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.