Find permutations of a string without Recursion

For every position we can swap each and every character and put resultant string in Queue.

Since queue is FIFO so we take each element out of queue and find all strings by putting next postion fixed.

While removing from queue place the string in set.

JAVA CODE

import java.util.*;

public class MainProgram {

    public static void main(String[] args) {
        String s = "abcd";
        printAllPermutations(s);
    }

    private static void printAllPermutations(String s){
        Set<String> resultSet = new LinkedHashSet<>();
        Queue<StringPerm> q = new LinkedList<>();
        q.add(new StringPerm(s,-1));
        while(!q.isEmpty()){
            StringPerm  resultObject = q.remove();
            String permStr = resultObject.getData();
            int permPosition = resultObject.getPositionFilled();
            resultSet.add(permStr);
            swapAndInsertInQueue(permStr,permPosition+1,q);
        }

        resultSet.forEach(System.out::println);
        System.out.println(resultSet.size());
    }

    private static void swapAndInsertInQueue(String s, int currpos, Queue<StringPerm> q){
        if(currpos>=s.length()){
            return;
        }
        for(int i=0;i<s.length();i++)
        {
            char[] str = s.toCharArray();
            char temp = str[currpos];
            str[currpos] = str[i];
            str[i] = temp;
            q.add(new StringPerm(new String(str),currpos));
        }
    }

}

class StringPerm{

    private String data;
    private int positionFilled;

    StringPerm(String data, int positionFilled){
        this.data = data;
        this.positionFilled = positionFilled;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public int getPositionFilled() {
        return positionFilled;
    }

    public void setPositionFilled(int positionFilled) {
        this.positionFilled = positionFilled;
    }

    @Override
    public String toString() {
        return data+","+positionFilled;
    }
}


Comments

Popular Posts