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();    }