Daily Coding Problem: Problem #685
最编程
2024-08-02 07:00:34
...
import java.util.*
/**
* This problem was asked by Facebook.
Given a string and a set of delimiters, reverse the words in the string while maintaining the relative order of the delimiters.
For example, given "hello/world:here", return "here/world:hello"
Follow-up:
Does your solution work for the following cases: "hello/world:here/", "hello//world:here"
* */
class Problem_685 {
/*
* solution: Queue+Stack, Time:O(n), Space:O(n)
* */
fun delimitersReverse(s: String, delimiters: CharArray): String {
val queueForDelimiter = LinkedList<Char>()
val words = Stack<String>()
//store the position for delimiter have seen
var lastIndex = 0
var i = 0
while (i < s.length) {
val char = s[i]
//meet a delimiter
if (char in delimiters) {
//avoid add empty space
if (i - lastIndex > 1) {
words.add(s.substring(lastIndex, i))
}
queueForDelimiter.offer(char)
//update lastIndex
lastIndex = i + 1
}
i++
}
//check for a word with no last delimiter
if (s.last() != queueForDelimiter.first) {
words.add(s.substring(lastIndex, i))
}
val result = StringBuilder()
//set up for result
//because words is longer than delimiters
while (words.isNotEmpty()) {
if (words.isNotEmpty()) {
result.append(words.pop())
}
if (queueForDelimiter.isNotEmpty()) {
val poped = queueForDelimiter.pop()
result.append(poped)
//check if need insert two same delimiter at same time
if (poped == queueForDelimiter.peek()) {
result.append(queueForDelimiter.pop())
}
}
}
return result.toString()
}
}
上一篇: 深入理解Java多线程中的synchronized关键特性
下一篇: CODING DevOps