1. 程式人生 > >給定一個字串,找出其所有不重複的排列組合

給定一個字串,找出其所有不重複的排列組合

給一個字串,比如ABC, 把所有的排列,即:ABC, ACB, BAC, BCA, CAB, CBC 都找出來。

 解題思路:

 對於一個n 位的字串來講,它是n-1位字串的排列 加上 沒有在 n -1 位字串裡 那個字元 的排列。 
 比如:

 對於字串ABC來講,它所有的排列就是 A + BC 的排列 加上 B + AC 的排列,再加上 C + AB的排列。

而BC的排列是 B + C 的排列 加上 C + B 的排列。所以,對一個字串,我們從中去一個值,然後求剩餘部分的排列,然後把它們再組合在一起。程式碼如下:

package permutation;

import java.util.LinkedList;
import java.util.Scanner;

/**
 * 排列組合一個字串
 * 給一個字串,比如ABC, 把所有的排列,即:ABC, ACB, BAC, BCA, CAB, CBC 都找出來。
 * 解題思路:
 * 對於一個n 位的字串來講,它是n-1位字串的排列 加上 沒有在 n -1 位字串裡 那個字元 的排列。 
 * 比如:
 * 對於字串ABC來講,它所有的排列就是 A + BC 的排列 加上 B + AC 的排列,再加上 C + AB的排列。
 * 而BC的排列是 B + C 的排列 加上 C + B 的排列。
 * 所以,對一個字串,我們從中去一個值,然後求剩餘部分的排列,然後把它們再組合在一起。
 * @author Administrator
 *
 */
public class PermutationString
{
	public static void main(String[] args)
	{
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext())
		{
			LinkedList<String> list=permutation(sc.next());
			System.out.println(list);
		}
	}
	
	private static LinkedList<String> permutation(String str)
	{
		LinkedList<String> permuList=new LinkedList<String>();
		
		//遞迴出口,當只有字串只包含一個字元的時候
		if(str.length()<=1)
		{
			permuList.add(str);
			return permuList;
		}
		
		for(int i=0;i<str.length();i++)
		{
			char ch=str.charAt(i);//當前在第一位的字元
			
			//相鄰字元相同的情況下,會出現一樣的排列組合
			//例如 "AABC",當i=0時,當前字元'A',子字串為"ABC"
			//當i=1時,當前字元為'A',子字串為"ABC",會得到一樣的結果
			if(i>0&&ch==str.charAt(i-1))
				continue;
			
			//接下來獲取不包含該字元的n-1位字元構成的字串
			String newStr=getSubString(str,i);
			//遞迴呼叫,直到newStr中只包含一個字元時
			LinkedList<String> newPermuList=permutation(newStr);
			for(int j=0;j<newPermuList.size();j++)
			{
				permuList.add(ch+newPermuList.get(j));
			}
		}
		return permuList;
	}
	
	/**
	 * 獲取不包含當前字元的子字串
	 * 如"ABC",當前字元為'A',則獲取字串"BC"
	 * @param str 當前字串
	 * @param i 當前字元的索引位置
	 * @return
	 */
	private static String getSubString(String str,int i)
	{
		//當前字元(ch)位置在str的第一位時
		if(i==0)
			return str.substring(1,str.length());
		//當前字元(ch)位置在str的最後一位時
		if(i==str.length()-1)
			return str.substring(0,str.length()-1);
		return str.substring(0,i)+str.substring(i+1,str.length());
	}
}


參考文章:http://blog.csdn.net/beiyeqingteng/article/details/7051942

相關推薦

給定一個字串所有重複排列組合

給一個字串,比如ABC, 把所有的排列,即:ABC, ACB, BAC, BCA, CAB, CBC 都找出來。  解題思路:  對於一個n 位的字串來講,它是n-1位字串的排列 加上 沒有在 n -1 位字串裡 那個字元 的排列。   比如:  對於字串ABC來講,它所有

題目描述:給定一個字串所有可能的字元組合. 比如:abc 所有組合是:a,b,c,ab,ac,bc,abc

/* 題目描述:給定一個字串,求出其所有可能的字元組合. 比如:abc 其所有組合是:a,b,c,ab,ac,bc,abc 是遞迴的思想:首先你拿到的是abc,你可以依次打印出去掉c,b,a的組合:ab,ac,bc 然後遞迴用這些子串去調動這個函式,比如ab:依次去掉b,

給定一個字串含有重複字元的最長子串的長度。 示例: 給定 "abcabcbb" 沒有重複字元的最長子串是 "abc" 那麼長度就是3。 給定 "bbbbb" 最長的子串就是 "b

Str = raw_input('plese input Str:') def qiu_chongfu(Str2):#定義判斷字串是否含有重複字元,如有返回0,沒有返回1 biao = 0 for i in range(0,len(Str2)): for j in

給定一個字串含有重複字元的最長子串的長度。

題目描述:   給定一個字串,找出不含有重複字元的最長子串的長度。 思路1:   依排列組合的所有可能拿到所有子串,依次傳入重複子穿的判斷方法中進行判斷,每次更新出不重複子串的最大長度! 具體程式碼:   1 import java.util.Scanner; 2 3 pu

給定一個字串最長的重複子串的長度

題目來源:這是程式設計珠璣上的一道題目 概念 字串的字首和字尾 例如字串 s =“abcdeabc” 則s的字首: “a”,“ab”,“abc”,“abcd”,“abcde”,“abcdea”,“abcdeab”,“abcdeabc”其中除了s

給定一個字串最長的重複子串

題目:給定一個字串,求出其最長的重複子串 如字串abcdabcabcd,求的最長重複子串為abcd 程式碼: void LongChar(char* str) {  if(str==NULL)   return;  int max=0; &

【每日面試題】給定一個字串最長的重複子串

題目:給定一個字串,求出其最長的重複子串 如字串abcdabcabcd,求的最長重複子串為abcd 程式碼: void LongChar(char* str) {  if(str==NULL)   return;  int max=0;  int first=0;  int

LeetCode 第3題:給定一個字串含有重複字元的最長子串的長度。

public class LeetCode3 { public static void main(String[] args) { /** * LeetCode第3題: * 給定一個字串,找出不含有重複字元的最

給定一個字串含有重複字元的最長子串的長度(javascript)

var lengthOfLongestSubstring = function(s){ var str = '';//存放當前最大無重複項字串 var len = 0;//存放當前當前最大無重複項字串長度 for(var i=0;i<s.length;

一個詞典其中所有最長的單詞。

題目 描述 給一個詞典,找出其中所有最長的單詞。 您在真實的面試中是否遇到過這個題? 樣例 在詞典 { “dog”, “google”, “facebook”, “internationalization”, “blabla” } 中, 最長的單詞集合為

輸入一個字串其中以“b”開頭的字母空格分割字母

#include<stdio.h> //找出以“b”為開頭的字母  #include<string.h> int main() { char string[100]; int count=0; printf("請輸入字串

給定一個字串s,最長的迴文子串

思路1:  1 從每一個迴文對稱點開始向左右遍歷,直到左右字元不相等。求出最長子串。 2 考慮迴文子串可能是奇數長度,對稱點只有一個。也可能是偶數長度。對稱點有倆個 程式碼: string longestPalindrome(string s) { int

Two Sum(給定一個一個數組中“和”為該值的數值組合

import java.util.HashMap; /** * Two Sum * * Given an array of integers, find two numbers such * that they add up to a specifi

面試程式設計題1:給定一個字串統計每個字母出現次數

       不管是自動化測試,還是測試開發,或者高階測試工程師,國內很多公司都開始要求編碼能力。在各種面試中,經常會問到一些程式設計如何實現的問題。本系列,專門記錄一些面試中遇到的問題,主要是用Ja

【演算法】字串第一個重複的字元

思想: 1、採用兩個int整數,firstHappen整數記錄字元對應ascii碼對應位,如果出現則為1,不出現預設為0; 2、reHappen整數記錄字元對應ascii碼對應位,如果重複出現的為1,否則預設為0; 3、然而對於任意字元,ascii碼是0-255,不可能有一

leetcode104 給定一個二叉樹最大深度。

給定一個二叉樹,找出其最大深度。 二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。 說明: 葉子節點是指沒有子節點的節點。 示例: 給定二叉樹 [3,9,20,null,null,15,7], 3 / \ 9 20 / \

LeetCode104 給定一個二叉樹最大深度。 二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。 說明: 葉子節點是指沒有子節點的節點。

給定一個二叉樹,找出其最大深度。 二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。 說明: 葉子節點是指沒有子節點的節點。 /** * Definition for a binary tree node. * struct TreeNode

演算法:給定一個整數陣列和一個目標值陣列中和為目標值的兩個數、判斷一個整數是否是迴文數

<!-- 給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數。 你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。 示例: 給定 nums = [2, 7, 11, 15], target = 9 因為 nums[0] + nums[1] = 2 + 7 = 9

給定一個整數數組和一個目標值數組中和為目標值的兩個數

目標 for循環 答案 [] 遍歷 一個 class tar 利用 題目描述: 給定一個整數數組和一個目標值,找出數組中和為目標值的兩個數。 你可以假設每個輸入只對應一種答案,且同樣的元素不能被重復利用。示例:給定 nums = [2, 7, 11, 15], targ

給定一個整數陣列和一個目標值陣列中和為目標值的兩個數。

給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數。 你可以假設每 示例: 給定 nums = [2, 7, 11, 15], target = 9 因為 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 個輸入只對應一種答