來源:牛客網2017年校招全國統一模擬筆試(第五場)程式設計題集合
時間限制:1秒 空間限制:32768K
牛牛有一些字母卡片,每張卡片上都有一個小寫字母,所有卡片組成一個字串s。牛牛一直認為迴文這種性質十分優雅,於是牛牛希望用這些卡片拼湊出一些迴文串,但是有以下要求: 1、每張卡片只能使用一次 2、要求構成的迴文串的數量最少 牛牛想知道用這些字母卡片,最少能拼湊出多少個迴文串。 例如: s = "abbaa",輸出1,因為最少可以拼湊出"ababa"這一個迴文串 s = "abc", 輸出3,因為最少只能拼湊出"a","b","c"這三個迴文串 輸入描述: 輸入包括一行,一個字串s,字串s長度length(1 ≤ length ≤ 1000). s中每個字元都是小寫字母
輸出描述: 輸出一個整數,即最少的迴文串個數。
輸入例子1: abc
輸出例子1: 3
分析
這道題需要一點思路。
我們知道迴文串的話,就是前後相等,那麼一個字元至少出現兩次,除了一種情況,就是可以有一個字元只出現一次,就是這個字元在中間。 所以,我們的思路就是統計出現奇數次字元的個數,假設只出現一個奇數次字元,那麼其他都是偶數次的,那麼直接奇數次的放中間就行了,所以至少是一種,如果沒出現更好,也是一種,如果出現兩個奇數次字元,那麼一個拿去放中間,另一個只能單獨領出來作為一個迴文串,所以至少要兩種,如果出現三個奇數次字元,那麼就至少要三種。所以問題就變成統計奇數次字元出現的個數
程式碼
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.nextLine();
in.close();
System.out.println(helper(s));
}
private static int helper(String s) {
int[] count = new int[26];
int ans = 0;
for(int i=0;i<s.length();i++) {
int j = s.charAt(i) - 'a';
count[j]++;
}
for(int i=0;i<count.length;i++) {
if(count[i] % 2 != 0)
ans++;
}
return (ans == 0)?1:ans;
}
}
複製程式碼