classSolution{public:vector<string>generatePalindromes(strings){intodd=0;unordered_map<char,int>count;// Get character occurrencefor(constcharc:s)++count[c];// Count odd onefor(constauto&[_,value]:count)if(value&1)++odd;// can't form any palindromeif(odd>1)return{};vector<string>ans;vector<char>candidates;stringmid;// Get mid and candidates charactersfor(constauto&[key,value]:count){if(value&1)mid+=key;for(inti=0;i<value/2;++i)candidates.push_back(key);}// Backtracking to generate our ans (strings)dfs(candidates,mid,vector<bool>(candidates.size()),"",ans);returnans;}private:// Generate all unique palindromes from candidatesvoiddfs(constvector<char>&candidates,conststring&mid,vector<bool>&&used,string&&path,vector<string>&ans){if(path.length()==candidates.size()){stringsecondHalf=path;reverse(begin(secondHalf),end(secondHalf));ans.push_back(path+mid+secondHalf);return;}for(inti=0;i<candidates.size();++i){if(used[i])continue;if(i>0&&candidates[i]==candidates[i-1]&&!used[i-1])continue;used[i]=true;path.push_back(candidates[i]);dfs(candidates,mid,move(used),move(path),ans);path.pop_back();used[i]=false;}}};
classSolution{publicList<String>generatePalindromes(Strings){intodd=0;Map<Character,Integer>count=newHashMap<>();// Get character occurrencefor(finalcharc:s.toCharArray())count.put(c,count.getOrDefault(c,0)+1);// Count odd onefor(Map.Entry<Character,Integer>entry:count.entrySet())if(entry.getValue()%2==1)++odd;// can't form any palindromeif(odd>1)returnnewArrayList<>();List<String>ans=newArrayList<>();List<Character>candidates=newArrayList<>();StringBuildermid=newStringBuilder();// Get mid and candidates charactersfor(Map.Entry<Character,Integer>entry:count.entrySet()){finalcharkey=entry.getKey();finalintvalue=entry.getValue();if(value%2==1)mid.append(key);for(inti=0;i<value/2;++i)candidates.add(key);}// Backtracking to generate our ans (strings)dfs(candidates,mid,newboolean[candidates.size()],newStringBuilder(),ans);returnans;}// Generate all unique palindromes from candidatesprivatevoiddfs(List<Character>candidates,StringBuildermid,boolean[]used,StringBuildersb,List<String>ans){if(sb.length()==candidates.size()){ans.add(sb.toString()+mid+sb.reverse().toString());sb.reverse();return;}for(inti=0;i<candidates.size();++i){if(used[i])continue;if(i>0&&candidates.get(i)==candidates.get(i-1)&&!used[i-1])continue;used[i]=true;sb.append(candidates.get(i));dfs(candidates,mid,used,sb,ans);sb.deleteCharAt(sb.length()-1);used[i]=false;}}}
classSolution:defgeneratePalindromes(self,s:str)->List[str]:# Get character occurrencecount=Counter(s)# Count odd oneodd=sum(value&1forvalueincount.values())# can't form any palindromeifodd>1:return[]ans=[]candidates=[]mid=''# Get mid and candidates charactersforkey,valueincount.items():ifvalue&1:mid+=keyfor_inrange(value//2):candidates.append(key)# Generate all unique palindromes from candidatesdefdfs(used:List[bool],path:List[chr])->None:iflen(path)==len(candidates):ans.append(''.join(path)+mid+''.join(path[::-1]))returnfori,candidateinenumerate(candidates):ifused[i]:continueifi>0andcandidate==candidates[i-1]andnotused[i-1]:continueused[i]=Truepath.append(candidate)dfs(used,path)path.pop()used[i]=False# Backtracking to generate our ans (strings)dfs([False]*len(candidates),[])returnans