Да, вы правы, что это O (n 2 ), и я думаю, что ваше доказательство в порядке, но это зависит от того, кому вы должны это доказать. Может быть, показать явно, как построить строку, которая привела бы к O (n) добавлениям размера O (n).
Вот простая рекурсивная версия, которая выполняет работу в O (n):
static String preToPost(String src)
{
StringBuilder dest = new StringBuilder(src.length());
for(int pos=0; pos < src.length(); pos = preToPost(dest, src, pos));
return dest.toString();
}
// Convert one prefix expression to postfix. Returns
// end position
static int preToPost(StringBuilder dest, String src, int pos)
{
if (pos >= src.length())
{
//no expression
return pos;
}
char c = src.charAt(pos++);
if ("+-/*".indexOf(c)>=0)
{
//operator. Convert both operands first
pos = preToPost(dest, src, pos);
pos = preToPost(dest, src, pos);
}
dest.append(c);
return pos;
}
Итерационная версия не намного сложнее:
static String preToPost2(String src)
{
StringBuilder dest = new StringBuilder(src.length());
int pos=0;
Stack<Character> stk = new Stack<>();
while(pos < src.length())
{
char c = src.charAt(pos++);
if ("+-/*".indexOf(c)>=0)
{
//operator. After the next 2 expressions, put c
stk.push(c);
//after the next expression, just do another one
stk.push('\0');
continue;
}
dest.append(c);
// done expression. check the todo stack
while(!stk.empty())
{
c = stk.pop();
if (c=='\0')
{
break;
}
dest.append(c);
// the append completed another expression, so loop
// to check the todo stack again
}
}
return dest.toString();
}
Это прямое преобразование рекурсивного.