Buttercola: Indeed: reverse String except HTML entity
Reverse string except for HTML entities, i.e, A HTML entities must be treated as an entire word without reverse.
e.g. "1234€" => "€4321"
"1234&euro" => "orue&4321"
"1234€567" => "765€4321"
Understand the problem:
Since a HTML entity must start with "&" and end with ";"
This problem can be solved in a two-step approach.
Step 1: reverse non-html tokens, and store the result into a list. For the HTML entity, do not reverse but just store into the result.
Step 2: construct the final result just concatenate the list in a reverse order.
Read full article from Buttercola: Indeed: reverse String except HTML entity
Reverse string except for HTML entities, i.e, A HTML entities must be treated as an entire word without reverse.
e.g. "1234€" => "€4321"
"1234&euro" => "orue&4321"
"1234€567" => "765€4321"
Understand the problem:
Since a HTML entity must start with "&" and end with ";"
This problem can be solved in a two-step approach.
Step 1: reverse non-html tokens, and store the result into a list. For the HTML entity, do not reverse but just store into the result.
Step 2: construct the final result just concatenate the list in a reverse order.
public
String reverseHTML(String s) {
if
(s ==
null
|| s.length() <=
1
) {
return
s;
}
List<String> tokens =
new
ArrayList<>();
int
i =
0
;
int
j =
0
;
while
(j < s.length()) {
char
c = s.charAt(j);
// Case 1: if c != &
if
(c !=
'&'
) {
j++;
}
else
{
// step 1: reverse substring before &
if
(j !=
0
) {
String token = reverse(s, i, j -
1
);
tokens.add(token);
}
// step 2: put the html entity into the tokens
StringBuffer sb =
new
StringBuffer();
while
(j < s.length() && s.charAt(j) !=
';'
) {
sb.append(s.charAt(j));
j++;
}
if
(j < s.length()) {
sb.append(
';'
);
tokens.add(sb.toString());
// step 3: update i
j++;
i = j;
}
}
}
// Reverse the trailing chars
if
(i < j) {
String token = reverse(s, i, s.length() -
1
);
tokens.add(token);
}
// Step 2: concatenate the final result
StringBuffer result =
new
StringBuffer();
for
(i = tokens.size() -
1
; i >=
0
; i--) {
result.append(tokens.get(i));
}
return
result.toString();
}
private
String reverse(String s,
int
start,
int
end) {
StringBuffer sb =
new
StringBuffer();
while
(start <= end) {
sb.append(s.charAt(end));
end--;
}
return
sb.toString();
}