-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathNiceString.java
99 lines (92 loc) · 2.39 KB
/
NiceString.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package com;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;
/**
* @author KOTBI Abderrahmane
* @version 1.1
*/
public class NiceString {
/**
* @param s
* @return the longest sub-string out of a s
*/
public static String longestNiceSubstring(String s) {
var allLowers = new HashSet<String>();
var allUppers = new HashSet<String>();
var differences = new HashSet<String>();
var buffer = new ArrayList<String>();
if (s.length() <= 1) {
return "";
} else if (!isNotNice(s)) {
return s;
} else {
for (var c : s.split("")) {
if (c.toLowerCase().compareTo(c) == 0) {
allLowers.add(c);
}
if (c.toUpperCase().compareTo(c) == 0) {
allUppers.add(c);
}
}
for (var c : allLowers) {
if (!allUppers.contains(c.toUpperCase())) {
differences.add(c);
}
}
for (var c : allUppers) {
if (!allLowers.contains(c.toLowerCase())) {
differences.add(c);
}
}
if (differences.isEmpty()) {
return s;
} else if (differences.size() == s.length()) {
return "";
} else {
for (var c : differences) {
buffer.addAll(Arrays.asList(s.split(c)));
buffer =
new ArrayList<String>(buffer.stream().map(e -> longestNiceSubstring(e)).toList());
s = buffer.stream().max(Comparator.comparing(e -> e.length())).orElse("");
buffer.clear();
buffer.add(s);
buffer.removeIf(e -> isNotNice(e));
}
}
return longestNiceSubstring(s);
}
}
static boolean isNotNice(String s) {
var allLowers = new HashSet<String>();
var allUppers = new HashSet<String>();
var differences = new HashSet<String>();
if (s.length() <= 1) {
return true;
}
for (var c : s.split("")) {
if (c.toLowerCase().compareTo(c) == 0) {
allLowers.add(c);
}
if (c.toUpperCase().compareTo(c) == 0) {
allUppers.add(c);
}
}
for (var c : allLowers) {
if (!allUppers.contains(c.toUpperCase())) {
differences.add(c);
}
}
for (var c : allUppers) {
if (!allLowers.contains(c.toLowerCase())) {
differences.add(c);
}
}
if (differences.isEmpty()) {
return false;
} else {
return true;
}
}
}