okay, i've been looking for a nice algorithm for this one for a long time, all i find are cpp, java and c# code. i've been trying to reverse the order of each word in its place, but i don't seem to be able to do so. i tried with two strings, swapping the chars of each word but it simply didn't work...
this is my...attempt to write each word backwards...

program stringzorz;

var
s1, s2 : string;
i, j ,k, start, endd : integer;

procedure swp(var c1, c2 : char);
var p : char;
begin
p := c1;
c1 := c2;
c2 := p;
end;

begin
s2 := s1;
endd := 1;
i := 1;
while i < length(s1) do
begin
while s1[i] <> ' ' do
i:= i + 1;
start := i;
j := i;
for i := endd to start do
begin
swp(s1[i], s2[j]);
j := j - 1;
end;
end;
writeln(s1);

end.

i know it's all...scrambled, i'm not that good at the esthetic part of coding but could someone please give me an idea atleast?

## All 12 Replies

umm, the thread can be removed...or saved...i've found a better way of reversing a sentence by deleating :

program stringzorz;

var
s : string;
i, j, k : integer;

begin
insert(' ', s, 1);
while length(s) > 1 do
begin
i := length(s);
while s[i] <> ' ' do
i := i - 1;
for j := i+1 to length(s) do
write(s[j]);
delete(s, i + 1,  length(s) - i + 1);
while s[i] = ' ' do
begin
if i = 1 then break;
write(s[i]);
i := i - 1;
end;
delete(s, i + 1, length(s) - i + 1);
end;
end.

For what its worth, here is my solution:

VAR

s, t, w : string;
i : integer;

BEGIN

w := '';
t := '';

FOR i := 1 TO length(s) DO
IF s[i] <> ' ' THEN
w := w + s[i]
ELSE IF length(w) > 0 THEN BEGIN
t := w + ' ' + t;
w := '';
END;

IF length(w) > 0 THEN
t := w + ' ' + t;

If I had to do it in-place, I would have just reversed the entire string, then reversed each word in the string...

But you did a good job with your temp strings. Nice!

im facing the same problem like this. my boss like to know how to reverse word in a sentence but you can only use 1 byte buffer (byte or char). could you help me? TIA

if the input is i love you, it should be you love i. and the long of the string isnt defined...

You'll need an index or pointer to the last character in the string, and an index or pointer to the first character in the string, and a temporary char. Then swap values, dec( last ), inc( first ) and repeat until last <= first.

Do the same thing for each word.

Good luck!

brilliant!!

thanks:)

but i would like to add that the last index/pointer need to find a space character before doing the swap proccess and then go back to an earlier word...:)

the rest would be the looping proccess:)

i found a simpler way to do it.. :)

like this :

input : im visiting your home
proccess : change the string upside down : emoh ruoy gnitisiv mi
do the 2nd process : turn it again by the words : home your visiting im

voila... we can do it with 1byte buffer much easier...

Isn't that what I suggested in #4?

yes,absolutely:)

Sorry I was grouchy. :\$ :)

Just another way to do this - introducing recursivity:

function Reverse(var value :string; start :integer) :string;
var
StrTmp :string;
begin
if start <= length(value) then
begin
StrTmp := '';
// getting the word
while (start <= length(value)) and
(value[start] <> ' ') do
begin
StrTmp := StrTmp +value[start];
Inc(start);
end;
// preserve spaces and put it before the word
while value[start] = ' ' do
begin
StrTmp := ' ' +StrTmp;
Inc(start);
end;
// recursive call to get the next word and insert it before the actual - StrTmp
Reverse := Reverse(value, start) +StrTmp;
end else
ReverseWord := '';
end;

var
sl :string;
begin
sl := Reverse(sl, 1);
writeln(sl);
end.

Bye

var St,StReverse:String; m,n:Integer;
begin
St:='I need to reverse this sentence';
StReverse:='';
n:=Length(St)+1;
repeat
m:=n;
repeat dec(n); until (St[n]=' ') or (n=0);
StReverse:=StReverse+' '+Copy(St,n+1,m-n-1);
until n=0;
Label1.Caption:=St+':'+StReverse;
end;

You can get the input string/strings from anywhere.
This was simply to show you another way!

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, learning, and sharing knowledge.