給定一個字串,找出其所有不重複的排列組合
給一個字串,比如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] 個輸入只對應一種答