现有一类加密后的密文字符串,其特征是字符串中相同字符不会连续出现超过2次。为了加强网络间传输的加密效果,我们制定了一套混淆机制,在不影响原密文数据情况下向字符串中随机位置插入一些连续的相同字符 (至少3个) 得到混淆后的字符串混淆后字符串的恢复方式是消除字符串中连续3个及以上的相同字符,消除后的字符串再拼接到一起继续消除,直到无法再消除。请编写一段代码,将混淆后的字符串恢复为混淆前的密文.java实现
解析:首先需要编写一个函数,用于判断字符串中是否存在连续3个及以上的相同字符。然后编写一个递归函数,用于消除字符串中的连续相同字符。最后编写一个主函数,调用这两个函数,实现混淆后的字符串恢复为混淆前的密文。
代码如下:
```java
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Decrypt {
public static void main(String[] args) {
String encrypted = "abccba"; // 示例加密后的密文字符串
System.out.println("加密前的明文: " + decrypt(encrypted));
}
public static boolean hasConsecutiveChars(String str, char targetChar) {
for (int i = 0; i < str.length() - 2; i++) {
if (str.charAt(i) == targetChar && str.charAt(i + 1) == targetChar && str.charAt(i + 2) == targetChar) {
return true;
}
}
return false;
}
public static String removeConsecutiveChars(String str) {
if (str.length() <= 2) {
return str;
}
int indexToRemove = new Random().nextInt(str.length() - 2);
String before = str.substring(0, indexToRemove);
String after = str.substring(indexToRemove + 3);
return before + after;
}
public static String decrypt(String encrypted) {
StringBuilder decrypted = new StringBuilder();
List<Character> chars = new ArrayList<>();
for (char c : encrypted.toCharArray()) {
if (!hasConsecutiveChars(decrypted.toString(), c)) {
chars.add(c);
} else {
if (chars.size() >= 3) {
chars.remove(0);
}
decrypted.append(c);
}
}
while (!chars.isEmpty()) {
char randomChar = chars.get(new Random().nextInt(chars.size()));
chars.remove(randomChar);
decrypted.append(randomChar);
}
return decrypted.toString();
}
}
```
这段代码首先定义了一个`Decrypt`类,其中包含一个`main`方法用于测试。`hasConsecutiveChars`方法用于判断字符串中是否存在连续3个及以上的相同字符,`removeConsecutiveChars`方法用于消除字符串中的连续相同字符,`decrypt`方法是主要的解密函数。在`main`方法中,我们调用`decrypt`方法对示例加密后的密文字符串进行解密,并输出解密前的明文。
创作工场
免责声明:
以上内容除特别注明外均来源于网友提问,创作工场回答,未经许可,严谨转载。
点击这里>>使用🔥专业版,更聪明、更完整、更原创!