Перестановка строки в верхний и нижний регистр - PullRequest
7 голосов
/ 22 июля 2011

У меня есть строка "abc".Как будет выглядеть программа (если возможно, на Java), которая переставляет строку?

Например:

abc
ABC
Abc
aBc
abC
ABc
abC
AbC

Ответы [ 5 ]

12 голосов
/ 22 июля 2011

Примерно так должно получиться:

void printPermutations(String text) {
  char[] chars = text.toCharArray();
  for (int i = 0, n = (int) Math.pow(2, chars.length); i < n; i++) {
    char[] permutation = new char[chars.length];
    for (int j =0; j < chars.length; j++) {
      permutation[j] = (isBitSet(i, j)) ? Character.toUpperCase(chars[j]) : chars[j];
    }
    System.out.println(permutation);
  }
}

boolean isBitSet(int n, int offset) {
  return (n >> offset & 1) != 0;
}
6 голосов
/ 22 июля 2011

Как вы, вероятно, уже знаете, количество возможных различных комбинаций равно 2 ^ n , где n равно длине входной строки.

Поскольку теоретически n может быть довольно большим, есть вероятность, что 2 ^ n превысит емкость примитивного типа, такого как int . (Пользователю, возможно, придется подождать несколько лет, чтобы все комбинации завершили печать, но это его дело.)

Вместо этого давайте использовать битовый вектор для хранения всех возможных комбинаций. Мы установим число битов равным n и инициализируем их все равными 1. Например, если входной строкой является «abcdefghij», начальные значения битового вектора будут {1111111111}.

Для каждой комбинации нам просто нужно пройти через все символы во входной строке и установить каждый из них в верхний регистр, если его соответствующий бит равен 1, иначе установить его в нижний регистр. Затем мы уменьшаем битовый вектор и повторяем.

Например, процесс будет выглядеть следующим образом для ввода «abc»:

Биты: соответствующая комбинация:
111 ABC
110 ABc
101 AbC
100 Abc
011 Abc
010 Abc
001 Abc
000 а

Используя цикл вместо рекурсивного вызова функции, мы также исключаем возможность возникновения исключения переполнения стека в больших входных строках.

Вот фактическая реализация:

import java.util.BitSet;

public void PrintCombinations(String input) {
    char[] currentCombo = input.toCharArray();

    // Create a bit vector the same length as the input, and set all of the bits to 1
    BitSet bv = new BitSet(input.length());
    bv.set(0, currentCombo.length);

    // While the bit vector still has some bits set
    while(!bv.isEmpty()) {
        // Loop through the array of characters and set each one to uppercase or lowercase, 
        // depending on whether its corresponding bit is set
        for(int i = 0; i < currentCombo.length; ++i) {
            if(bv.get(i)) // If the bit is set
                currentCombo[i] = Character.toUpperCase(currentCombo[i]);
            else
                currentCombo[i] = Character.toLowerCase(currentCombo[i]);
        }

        // Print the current combination
        System.out.println(currentCombo);

        // Decrement the bit vector
        DecrementBitVector(bv, currentCombo.length);            
    }

    // Now the bit vector contains all zeroes, which corresponds to all of the letters being lowercase.
    // Simply print the input as lowercase for the final combination
    System.out.println(input.toLowerCase());        
}


public void DecrementBitVector(BitSet bv, int numberOfBits) {
    int currentBit = numberOfBits - 1;          
    while(currentBit >= 0) {
        bv.flip(currentBit);

        // If the bit became a 0 when we flipped it, then we're done. 
        // Otherwise we have to continue flipping bits
        if(!bv.get(currentBit))
            break;
        currentBit--;
    }
}
4 голосов
/ 16 июля 2016
String str = "Abc";
str = str.toLowerCase();
int numOfCombos = 1 << str.length();  

for (int i = 0; i < numOfCombos; i++) {

    char[] combinations = str.toCharArray();
    for (int j = 0; j < str.length(); j++) {

        if (((i >> j) & 1) == 1 ) {
            combinations[j] = Character.toUpperCase(str.charAt(j));
        }

    }
    System.out.println(new String(combinations));
}
0 голосов
/ 10 марта 2018

Вы можете сделать что-то вроде

`` `

import java.util.*;
public class MyClass {
    public static void main(String args[]) {
        String n=(args[0]);
        HashSet<String>rs = new HashSet();
        helper(rs,n,0,n.length()-1);

        System.out.println(rs);
    }
    public static void helper(HashSet<String>rs,String res , int l, int n)
    {
        if(l>n)
        return;

        for(int i=l;i<=n;i++)
        {

            res=swap(res,i);
            rs.add(res);
            helper(rs,res,l+1,n);
            res=swap(res,i);
        }

    }
    public static String swap(String st,int i)
    {
        char c = st.charAt(i);

        char ch[]=st.toCharArray();
        if(Character.isUpperCase(c))
        {
            c=Character.toLowerCase(c);
        }
        else if(Character.isLowerCase(c))
        {
            c=Character.toUpperCase(c);
        }
        ch[i]=c;
        return new String(ch);
    }

}

`` `

0 голосов
/ 22 июля 2011

Пожалуйста, найдите здесь фрагмент кода для вышеуказанного:

public class StringPerm {
public static void main(String[] args) {
    String str = "abc";
    String[] f = permute(str);

    for (int x = 0; x < f.length; x++) {
        System.out.println(f[x]);
    }

}

public static String[] permute(String str) {
    String low = str.toLowerCase();
    String up = str.toUpperCase();

    char[] l = low.toCharArray();

    char u[] = up.toCharArray();

    String[] f = new String[10];
    f[0] = low;
    f[1] = up;
    int k = 2;

    char[] temp = new char[low.length()];

    for (int i = 0; i < l.length; i++) 
    {
        temp[i] = l[i]; 

        for (int j = 0; j < u.length; j++) 
        {
            if (i != j) {
                temp[j] = u[j];
            }
        }

        f[k] = new String(temp);
        k++;
    }

    for (int i = 0; i < u.length; i++) 
    {
        temp[i] = u[i];         

        for (int j = 0; j < l.length; j++) 
        {
            if (i != j) {
                temp[j] = l[j];
            }
        }

        f[k] = new String(temp);
        k++;
    }

    return f;
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...