蓝桥杯基础练习:
问题描述
回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
交换的定义是:交换两个相邻的字符
例如mamad
第一次交换 ad : mamda
第二次交换 md : madma
第三次交换 ma : madam (回文!完美!)
交换的定义是:交换两个相邻的字符
例如mamad
第一次交换 ad : mamda
第二次交换 md : madma
第三次交换 ma : madam (回文!完美!)
输入格式
第一行是一个整数N,表示接下来的字符串的长度(N <= 8000)
第二行是一个字符串,长度为N.只包含小写字母
第二行是一个字符串,长度为N.只包含小写字母
输出格式
如果可能,输出最少的交换次数。
否则输出Impossible
否则输出Impossible
样例输入
5
mamad
mamad
样例输出
3
【分析】:首先要判断该字符串能不能变成回文串,如果不能你去进行操作就是在浪费时间了,所以判断依据就是统计该字符串中的各字符个数为奇数的个数,如果为奇数的字母个数大于1个,说明整个字符串到最后会有两个落单的字母,肯定不能凑成回文串了,所以这种情况直接“Impossible”就可以了。如果能成为回文串的话,就写一个函数进行递归求解。

1 import java.util.Scanner;
2
3 public class Main{
4 public static void main(String args[]){
5 Scanner sc = new Scanner(System.in);
6 int N = sc.nextInt();
7 String string = sc.next();
8 if(isPossible(string)){
9 System.out.println(getResult(string));
10 }else {
11 System.out.println("Impossible");
12 }
13 sc.close();
14 }
15
16 private static boolean isPossible(String str){
17 int odds = 0;
18 boolean ans = true;
19 int[] temp = new int[26];
20 for(int i=0;i<str.length();i++){
21 temp[str.charAt(i) - 'a']++;
22 }
23 for(int j=0;j<26;j++){
24 if(temp[j] % 2 == 1){
25 odds++;
26 }
27 }
28 if(odds > 1){
29 ans = false;
30 }
31 return ans;
32 }
33
34 private static int getResult(String str){
35 int length = str.length();
36 if(length == 1 || length == 2){
37 return 0;
38 }
39
40 int temp = str.lastIndexOf(str.charAt(0));
41 if(temp == 0){ //说明这个是除了自己没有找到相同的字母与之匹配了,所以这个需要放到整个字符串的中间。
42 return length/2 + getResult(str.substring(1,length));
43 }else {
44 StringBuffer sb = new StringBuffer(str);
45 sb.deleteCharAt(0);
46 sb.deleteCharAt(temp);
47 return length-1-temp + getResult(sb.toString());
48 }
49 }
50
51 }
【PS】:就这样就结束了吗?来看个样例!

输入: 6411 sappytuikoulwwzcdyykjigdynflzrbgffqfkpzzsbfnampapwsmsgtqylggqykoyqltfefkbytkreaybkiqamzxpoefmewfkxezuyqqdqtafgliflgfhhvcwcidfxfxymykkiweifeoceeqhzmiemldhpfgpwwehwrnrudplsgxemvcukkjnbijaqodifjsfbdbonepsdkxegwoqfcyartakjwssimelxzwvpangaknsdravlvryyolpikgwpcolpfafsjzurfwpwookfzeadyhmsyoycmtggjvdmkssejwfwoxpcfkuxvzrbusnqdctlkfjqkuuzqaqdojgknyjcdwdiknjzgswqerddyplpdqjmlqwvvkfsnrampmzokzcozdtxyzottpktwkuyrbmcargygsvkcqzkhgzcxiigabicpfdbtybrcshsimfjxlaxhefnjghcvxgxnigpjpyxninaivtmhaszwxnxbudyiqffzzasnqgxrwhpoerkrdblqwaykczhdoptnhjzadlcrvndstsswrpwdqfumramzttajjwuamhzkxkjmwjuluzikkrxiybukxmzomcyyvpdxjlcnanpccyulztofgeylmtcgucpgkpejiwoonbwmkmcrsntutviafkpqrrrjqqlgefopsvtrwajxykjlzejmeystpuhceyeydobmosbvhwjlrwqtsflfqwsfxieovpzfckvlmlrftvwkqtehuedvgmxasfqvgtcagzbginipwpmrtzpaqllvkmgsqifgbskpakafgdfygwmexattappgcphdbztwbrtjcywonvweooypwebqucjcofuuqcgwoglndynyhvvafpjksdtayrtfxomihonqbplkomlfeykmqkcixwjznwcoshwmjfvduuymrmqrzxvivjtbbvyxwjlzfantrlexmmzayhgizsrknfpruzfydqngctgzhqdrjskodqndepjctylqezpoglzmterqyvqbnkcafnuyqlhcjfulivmloeppzasrccbkuliwsibwmmqxiagkkgoddduokpesjkxjssavowtcojymmadnsyxejdfhwyjpeypdlgptfbfsursrnapnhlngynsrliudvdkghpcitdpeztkshhtrmvdhbriimbfzjfaidpgoeboixeeclpktdnazxwgfzpywjsnrzxhhxqdekxmakvcmhfsszxgelwzsznngmsnxmwvbhqbcjfyfxrnssaqyulymlsffrwqbqxebezmekkphwpdhvpxmjelrbktvvwkylxrseejefeprjqrgojokwrzmtztptdzjiwxwlzqrrpynzflrqnskrxgtpdyhpulotnbpxbyhfnjafgqwfxlwasvbbkcezuomworxjaspxwbwlecuwegzjvmojvedsnauaagbjflwexvwujjktesgwkwvgajevghsvntornhlihpxnoflslgnfxempzpvzysnuloresuhxdkjxrjpororzobkmxccxfvoqcnipbwfaiwaiyjqwzlbkkemthmvwxletndxmzjwdjgfharrsregupxtpfzxvquikiqpxjnpquzzddlntsnbitaestbtjxyglrkgriuddweiejdyomelhsbfyxrgqpulwwqpiewpylhwekejwmtovliclxkbikubvmbtfwzkzbtpxrehkfyvxkmappaddiwcczwtypoitaabayepamoxldhmeezjxaqptyhlvnzsplbtbibrcrlkblnqbdlbwnvmaioyqpxbaeijbhavvxnspjqtwcolomyyxaiblhizmexplkpqsjibbpxpcegmzliadlonijvpnfyzowushrwrzvridzzdklnrvdlrpqeteoyehelovnicjzfphmswzncxxkmegvgohwdpecpavlgjclucqnuwdxzrtdrevjwmggryqfmzplcwuiuggtglgfveiuuzjkladcnfhfkqheudqqbaawjxeogsbabwxzvwopvzsbatxbucqvenhcnbuvmfvkfizmclwmiciqagvrwsufoejbdwamdzefypypuahjeobovoebtylwrpigmncfxjychvcpxwmfjqxkytpawxgubbqgwtacdakdytmpoenfhfmngnccdcwoxrwzqhnbexmsespdduyqxyccwywdipsrkfbhvrjafasunmlbbmeleljznitrqsudmccicvdgelianrbyozqfnemvgzvejtynztygmfxlvwaoizejelyzkfmkblxhfxzimsybwwlpbaeswojyqoolebmjxvaulwklllftzyxtnmhhpqolzbbvnzeflsyzffikgnqpfyyoxgchrsosdomacmlfsmvztstrmprsukxchlxpgoiimcvueeysmrethmokudcwnoxdyxaojsyjhcorscllxbrdmqanyywdencqvrxrykwapneqbdevsxqnkxpshrwgvuctrbcvmmyyqjtdrnsyxojskbyboiqoaqsusmcanpjowfwdksedafofebqfhlrcmaoxictcxhhmgeueidjjvkxxdhvaaqwqkvrfknfvnvqseehddbtlwyhobibwonloliqiclvkxpvmvfiopxjwuwmdqtmgrqewefanwyutcjdzgrkgjowgpvwbvdcaarlobwgwjnwdrfajdmiajwxwzmfmjdgeeygzowlpmbyeedpaqathcmcggymlpjwmoxgttwyccpyttsybjnrdifgspavzqdjqxmnumlofzdhwqmmquymmxidfmigceboxnehkzlvpsbfopgxwqjkdzaibgimxicfrwfficnkskmzbazoaqkzyscsbvirtgisqdzopzhbtpnvrkweuwrlhilyohmgakvxooyipimkbncwfhiypmjhuqraoptmdtknqulhuqfahnawqqhxgrqqyqxiprjcbzphoqqnoydultlarooiopayhvjzzobjpcwkkarhshkvmspojljxpvybnkvabphvgcedlxmutprexubxubzsrwnjeuockmriewwskwwjrsjnxchcloutqzisltrjvohqckhsldvypwylhtejztdshjntmwvnygyxnnkrwqfoizszraevalfokmfimneyqwnpvtomyrecdvadthbxzcjdzdbinlzxwqdaomljbhlvxpzmelcjtxudcdwgvqsdumypzcujeqajsbutfmyrqzmhuelyaupuajrazsenjvqeoadfogwwfiykkoaxabhihtgcyxkfneejwdpxwrhygsmhtgwosheaizmngyikxaihfkzyqbvxqomkjpvejaqfmkbxqnirylwojablxrvarvuppooywbyheqvodvfhlyvvwdzkrkxlqjrkgnxqjrazxqqjycnjthwjdxarcipcfkcufzsfihtfirdxipfizkrukrcjfoiehpencmzkjxgerwervczxfozdhalwsrgpyjuzhcktrwjmlwwujqrqpryhbmvuekwniryylpjcibbdggiuhwbsopbqwbhapnkxyuezsrhxaagyuiyyvjyrgqpngzkrugfydbhekbbgfkhqantesdprcogqclthredomaikgvmizqfgsreizjlaycdhxkjzfoevcohckyhoyjprjjxzqvgbeabwdesacbwgawepspblxbxijihnnewnigrmkdtrpmqnufnkqpylxsxhlmnxptoiscfjezkbywluexexjeaeghftswkaxqtfvalzbsbhuldhfmhwjhvlxcwdelnrzxuhgtigyzxokknwwskblroubrvmuhzhomxqothcqqasccokuyfrvhbpunsmadljpuvtacosgbdfjwzmzsrnbyyzljzelaimgdjzsxmsvkdbswceueezblglqdvvkxtpcujmwrlnuikouguteneyubdozcirisnielfsfaaeeclkhmrcsiaignolqijovzuofzfwxknmunybiteudqwmcfmmraxmbgqnbrepsawlitmohassjctziwssussdgqekmomazkehuotdquywontmcqfdjytkobszshanaahybyztonzfsxagzgypfwrbvycsfhuwkpyiknzjbtjyswkyyqfbjgxrpdvftuvzazldeyvarqokrohakuiynmvhzlvpfcpmvtuswqpukaigiltiptdqwiwnkorwpwfavblhyxcayanqghpsxhtxxmomfusfxychdoipvhlkhyhquodgicvxpleclzdlpjnqrhzsqgywndrngzdhddlfrdfdkpxygsyivnkyllgdgjqmnjkqoaggyigupeszaaiwcaxpsmdlbncpbewgootnxflxkyjdtwfhlneoebtusajmpcunolyoljzvdwlblkufvgfwmfnujzlgibgekepizmkvrgaosdksjztgrggivjnjutjiupezyliytifpmcwlepaflxrvkmxmfykfzlcoyagtwaapsjsisfleewvcxhacdnoutiaswmrrowspudxfyirdrvzgoxwfddbjesttyiegorizayjtptmqjawdlvexavcqyxoyfofhlntiknsfhyyxowhydwliowfxvprmvdhhlswcaohxydptlhzqolghsumdfejejtxdxrsoxgdauujhqmoekvwngwykeisutbknmyrlwemprzylvwpfipcgxivtardnyeelkkoegcmmbbqxfwinjmemhmujzqsdwwvubnpklxfavwfucegnyfkjdhvdvfugrgmieiyqkvgmsxmndyagiileudwjmvkamrfiymbvxnbtxondjyezoxgzfgczkzqbhpzqljridyekktyfdxyjanxvbfxggbiyqiflxaffrhcgrnpeqsunhysnaqrgmkpfnvnjrahhiuqwwrmjpcfztnmlwtwrxuiwdsufrffqbweglkbiihkqtajmdxrckljolwvaqlsssldowrstawykzqycmvhbhxdehodxigehgwivduygijbcdxhhgmdcemedapvuclhbgddgecvehtbnhgktvwlpostvfrutwvnukuwqnmyyviipmzjvqkgxocvqipyrdbhhdwucfybxglygbecdiudnfbcfgzxuzvadjxiufpiyxfpcgnrskzoobfofqqkymtywnmaalypgvfthfbugmwaqihcgiypbvqqulafbftsgcxsffdblbcojgwqlihahqvlumlwhiclpkgnwoysxdmjontcxelxxtadafrtkqelplpstokagittwitvwagelqqkmjgwabtcidjizzzdqboagubirutfcrmiuydyduqbfbqzhnuqguwdkierojpoofjynxixxfpzrmmppiupzllrgynngccazhqmosjipseoibjcosxunwilqvehiciqchktcarjryoxtnyydejyedxwtktqmdehfygrurccdaromvcwpgwbmwrichzkembthbrvdzhnqddkvxhemljdkgciictkuhvtehmqugtskgpejfcpqneorqvssszwbqlukcmvngrvjfxcksjzgrxdihjdrpqkrhdiqiiiyrfztyyhejleoejnxndmozvtaicuhmzzceotkuivpfsalmrkawxyuexpnsdmtedzkvvuowoemdlodjhfbbmohaxezaiklecwpqakjgojgxsucnzgbdmqgeuaowqgqjuhbyzeeuhhuxihiwngtwlceemqchcfsmyxgaryybfmlmsultghnngalgvnslwogyeyxvqlaxoiphskxhtsozfqdvsblhgymfdfnwhuirdxsdqfhsdpxudeopgehsreklavccriotdkewclthbpccmrxycpcshxnrvrfzpwbobxkjyprgtpqjfacpyvtvwmtfltejbboxgjfqeldjqualijjfnkbrcqsydgifrarjqoomkfrjtnnlpcsioqynqbcgylmyhdzezctxgbohwuqoslysfsmwgnywsghhprdykxyhzcejzddhhfabsksyhovhusvlkyomxevrgkecpqizlptieorihsrhrhclpscxmitxzidfrxpdayqegibbfagzlwhnvsefzeadilrptxgumndxjejxvbqkymrjysxgejrocdwnufhbroxbnlsaeezlgejogqfdmwsqaqjzbpmcyppwodangvdtspwjxnniitwwojcxmhmzkvcydfelokrpthauxmdodlvfyeuqalcypoirtmojnkjhtofwcdmwlmejizqttmzrbmzilpissdrxuebstfpgbnfoilbizrsdrydoofyqcbqyeygctvblglqkfnouhgbbivzmwtioxcmoxlhxhdxbvwlyainlaryjhebvmlzzbguwtyplbmzqfkfpjvrsxjoaxgzolyvbyhgzaoxape 输出: 541435
看到这个样例,输入到程序中抛出了异常 java.lang.StringIndexOutOfBoundsException: String index out of range: 6176
所以我们输入就不能使用String 来接收这个很长的字符串了,要想个别的办法才行。

1 import java.io.BufferedReader;
2 import java.io.IOException;
3 import java.io.InputStreamReader;
4
5 public class 完美的代价 {
6
7 public static void main(String[] args) throws IOException{
8 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
9 int len = Integer.parseInt(reader.readLine());
10 char[] s = reader.readLine().toCharArray();
11 reader.close();
12 if (palindrome(s, 0, len - 1)) {
13 System.out.println(cnt);
14 } else {
15 System.out.println("Impossible");
16 }
17 }
18
19 private static int cnt = 0;
20 private static boolean haveMiddle = false;
21
22 private static boolean palindrome(char[] s, int a, int b) {
23 if (b <= a) {
24 return true;
25 }
26
27 // 从最后的位置开始遍历字符串
28 for (int i = b; i > a; i--) {
29 if (s[a] == s[i]) {
30 exchangeTo(s, i, b);
31 cnt += getExchangeTimes(i, b);
32 return palindrome(s, a + 1, b - 1);
33 }
34 }
35
36 // 如果没有出现过中间字符
37 if (!haveMiddle) {
38 haveMiddle = true;
39 cnt += getExchangeTimes(a, s.length / 2);
40 return palindrome(s, a + 1, b);
41 }
42 return false;
43 }
44
45 private static int getExchangeTimes(int a, int b) {
46 return b - a;
47 }
48
49 private static void exchangeTo(char[] s, int a, int b) {
50 char temp = s[a];
51 for (int i = a; i < b; i++) {
52 s[i] = s[i + 1];
53 }
54 s[b] = temp;
55 }
56
57 }
来源:https://www.cnblogs.com/AIchangetheworld/p/12536995.html
